如何选择XML中的所有列

时间:2014-09-03 09:27:48

标签: sql-server xml

DECLARE @x AS XML
SET @x = '<Table1><c1><![CDATA[1]]></c1><c2><![CDATA[Sample Record]]></c2><c3><![CDATA[Test Data]]></c3></Table1>'
SELECT * FROM @x.nodes('/Table1')

我想在不定义列名的情况下选择所有列(使用*)

1 个答案:

答案 0 :(得分:3)

没有相当于select *的内容。最接近的是获取一列中的节点值和另一列中的节点名称。

select T.X.value('local-name(.)', 'nvarchar(max)') as ColName,
       T.X.value('text()[1]', 'nvarchar(max)') as ColValue
from @x.nodes('Table1/*') as T(X)

结果:

ColName              ColValue
-------------------- --------------------
c1                   1
c2                   Sample Record
c3                   Test Data

如果要将节点名称作为输出中的列名称,则必须构造一个查询,指定要从中获取值的节点,并且必须指定要用于该列的列别名。

select T.X.value('(c1/text())[1]', 'nvarchar(max)') as c1,
       T.X.value('(c2/text())[1]', 'nvarchar(max)') as c2,
       T.X.value('(c3/text())[1]', 'nvarchar(max)') as c3
from @x.nodes('Table1') as T(X)
c1                   c2                   c3
-------------------- -------------------- --------------------
1                    Sample Record        Test Data

可以使用XML作为源动态构建和执行该查询。

declare @SQL nvarchar(max) =
'select '+stuff((select ',T.X.value(''('+C.Name+'/text())[1]'', ''nvarchar(max)'') as '+C.Name
                 from @x.nodes('Table1/*') as T(X)
                   cross apply (select T.X.value('local-name(.)', 'nvarchar(max)')) as C(Name)
                 for xml path(''), type).value('text()[1]', 'nvarchar(max)'), 1, 1, '')+
' from @x.nodes(''Table1'') as T(X)'

exec sp_executesql @SQL, N'@x xml', @x