2
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')
我想選擇所有列的所有列沒有定義的列名(使用*)如何選擇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')
我想選擇所有列的所有列沒有定義的列名(使用*)如何選擇XML
沒有相當於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
感謝您的信息,它可以幫助我很多 – jayvee 2014-09-04 13:21:35