没有等同于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)
Result:
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