SQL Server 2005/2008.
我在这里和其他地方以及BOL中搜索并阅读了几个问题,但到目前为止我还没有找到直接回答这个问题的答案。
给定declare @xml xml = '<Root> <Ent foo="abc" bar="def" /> </Root>'
是否有办法得到类似
的结果集?col1 col2
-----------------
foo abc
bar def
我知道如何通过使用sp_xml_preparedocument和OPENXML来做到这一点,我只是想知道是否有一种方法可以直接使用xml方法。我没能在BOL或谷歌中找到任何东西,但只是想确保我没有错过什么。
谢谢!
这可能会给你一个起点,让你得到你所需要的。
DECLARE @xml xml = N'<Root> <Ent foo="abc" bar="def" /> </Root>';
WITH [Attributes]([xml])
AS
(
SELECT
@xml.query
('
for $x in (/Root/Ent/@*)
return <attribute name="{local-name($x)}" value="{data($x)}"/>
')
)
SELECT
[Attribute].[data].value(N'@name', N'nvarchar(max)') AS [col1],
[Attribute].[data].value(N'@value', N'nvarchar(max)') AS [col2]
FROM
[Attributes]
CROSS APPLY
[xml].nodes(N'attribute') AS [Attribute]([data]);
一般情况下,query()方法的工作速度比value()慢。所以我建议使用value()方法:
SELECT
b.value('local-name(.)','nvarchar(MAX)') as col1,
b.value('data(.)','nvarchar(MAX)') as col2
FROM @xml.nodes('//Root/Ent/@*') a(b)
与之前的答案相比,大约快了3倍。