2011-10-10 31 views
0

SQL Server 2005/2008。使用xml方法在SQL Server中列出XML實體的方法?

我已經在這裏和其他地方以BOL搜索並閱讀了幾個問題,但目前爲止我找不到直接回答這個問題。

鑑於

declare @xml xml = '<Root> <Ent foo="abc" bar="def" /> </Root>' 

有沒有辦法得到一個結果集的像

col1  col2 
----------------- 
foo   abc 
bar   def 

我知道如何使用sp_xml_preparedocument中和OPENXML要做到這一點,我只是想知道,如果有一種直接使用xml方法的方法。我一直無法在BOL或谷歌搜索中找到任何東西,但只是想確保我沒有錯過任何東西。

謝謝!

+0

此問題和答案是否有幫助? http://stackoverflow.com/questions/324289/xquery-to-get-list-of-attributes – Andrew

+0

對不起,它有時就像這些我意識到我遺漏的東西。與對sp_xml_preparedocument和OPENXML的調用一樣,我試圖在T-SQL中執行此操作。 – vr8ce

+0

SQL Server在T-SQL中具有可用的XQuery子集。這就是爲什麼我指出這個問題。我沒有時間進一步研究你的問題,但是似乎前面問題的目的與你目前問題的目的類似。 – Andrew

回答

2

通常,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倍。

+0

這是一個更好的解決方案。 +1 – etliens

+0

同意,抱歉花了這麼久才這麼說! – vr8ce

+0

vr8ce,沒問題。我希望這對作者有幫助。 – Dalex

3

這可能會給你一個出發點,讓你得到你需要的東西。

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]); 
+0

迷人。這是一些嚴重的T-SQL和XML-fu。 :)這就是安德魯提到的問題,但我沒有足夠的智能將它翻譯成T-SQL。非常感謝! – vr8ce