我不清楚你的输出应该是什么样子。然而,这应该让你开始:
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! –