2014-09-03 51 views
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

回答

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 
+0

感謝您的信息,它可以幫助我很多 – jayvee 2014-09-04 13:21:35