在SQL Server中使用XML方法列出XML实体的方法


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倍。

最新更新