我不清楚你的輸出應該是什麼樣子。然而,這應該讓你開始:
create table MyXmlTable (MyXmlCol xml)
insert into MyXmlTable (MyXmlCol) values
(
'
<Root xmlns="http://tempuri.org" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Elem1 type="T1">
<Name type="string" display="First name">John</Name>
<TimeZone display="Time zone">
<DisplayName type="string" display="Display name">GMT Standard Time</DisplayName>
</TimeZone>
</Elem1>
<Elem1 type="T2">
<Name type="string" display="First name">Fred</Name>
<TimeZone display="Time zone">
<DisplayName type="string" display="Display name">EST Standard Time</DisplayName>
</TimeZone>
</Elem1>
</Root>
');
;WITH XMLNAMESPACES(DEFAULT 'http://tempuri.org')
select MyXmlCol.query('/Root/Elem1/Name')
from MyXmlTable
這將查詢「名稱」元素XML - 你可以修改這取決於你想要什麼樣的輸出的查詢。這是一個有點長,但SQLXML MSDN文章是相當翔實:
http://msdn.microsoft.com/en-us/library/ms345117(v=sql.90).aspx
希望這有助於!
約翰
更新:你可以添加一個where子句這樣的東西。我還沒有你想要的輸出是什麼樣子清楚,但是這樣會過濾掉「Elem1」值:
SELECT C1.query('fn:local-name(.)') AS Nodes
FROM [dbo].[MyXmlTable] AS MyXML
CROSS APPLY MyXML.MyXmlCol.nodes('//*') AS T (C1)
WHERE CAST(C1.query('fn:local-name(.)') AS NVARCHAR(32)) <> 'Elem1'
還有一個更新;希望這是你正在尋找的答案!
嘗試在查詢中使用通配符。我不得不使用動態SQL,因爲XML查詢()函數只會爲路徑使用字符串文字(可以使用sql:variable(「@ filter」)作爲值,但我無法獲得路徑的效果。 )
DECLARE @filter nvarchar(20)
SET @filter = '*/Elem1'
DECLARE @sqlCommand nvarchar(1000)
SET @sqlCommand =
';WITH XMLNAMESPACES(DEFAULT ''http://tempuri.org'')
select MyXmlCol.query(''' + @filter + ''')
from MyXmlTable'
print @sqlCommand
EXECUTE sp_executesql @sqlCommand, N'@filter nvarchar(20)', @filter = @filter
這將返回Elem1 XML(和所有子節點):
<p1:Elem1 xmlns:p1="http://tempuri.org" type="T1">
<p1:Name type="string" display="First name">John</p1:Name>
<p1:TimeZone display="Time zone">
<p1:DisplayName type="string" display="Display name">GMT Standard Time</p1:DisplayName>
</p1:TimeZone>
</p1:Elem1>
<p2:Elem1 xmlns:p2="http://tempuri.org" type="T2">
<p2:Name type="string" display="First name">Fred</p2:Name>
<p2:TimeZone display="Time zone">
<p2:DisplayName type="string" display="Display name">EST Standard Time</p2:DisplayName>
</p2:TimeZone>
</p2:Elem1>
如果你想挑選出 「時區」,你這樣做:
SET @filter = '*/*/TimeZone'
結果應該只有值'GMT標準時間',輸入將是'TimeZone'節點元素 –
@SeeSharp - 已更新的答案。如果你總是想查詢「TimeZone」,你只需用'TimeZone'替換'sql:variable(「@ Node」)''。 –
謝謝Mikael! –