2011-10-31 197 views
2

我在數據庫中的XML列,可能看起來像的:SQL Server的XML解析第一個節點屬性

<sql-connection-info name="myname" server="(local)\SQLEXPRESS" other-attribute="value" /> 

<oracle-connection-info name="othername" server="address" other-attribute="value" /> 

等。節點和屬性的名稱幾乎可以是任何東西。我需要迭代第一個節點上的屬性/值對。我看到的每個樣本都是針對已知的節點/屬性名稱。

當我試圖用

@xmlColumn.query("/@*") 

我得到這個錯誤

的XQuery [查詢()]:頂級屬性節點不支持。

這是可能的TSQL?如果是,我該怎麼做?

回答

3
declare @xmlColumn xml = '<sql-connection-info name="myname" server="(local)\SQLEXPRESS" other-attribute="value" />' 

select T.N.value('local-name(.)', 'varchar(max)') as Name, 
     T.N.value('.', 'varchar(max)') as Value 
from @xmlColumn.nodes('//@*') as T(N) 

結果:

Name    Value 
---------------- ------------------- 
name    myname 
server   (local)\SQLEXPRESS 
other-attribute value 
+0

謝謝你,這是我需要的。 :) – mron

+0

@Mikael有沒有辦法限制它?我有類似的XML,但它也有子節點,我只想要頂層節點的屬性。謝謝! – mbourgon

+1

@mbourgon當然,這是雙斜槓,使其包括子節點。改爲'nodes('/ */@ *')'。 –

1

您可以使用

@xmlColumn.query("/node()[1]") 

讓每個條目的第一個節點。 node()匹配任何元素節點。 從你的帖子我不明白,如果你想有電子。 G。您條目的第一個節點的name屬性。那麼你可以使用:

@xmlColumn.query("/node()[1]/@name") 
+0

我需要的所有屬性,並得到他們的名字和值。我不能使用這個@ xmlColumn.query(「/ node()[1]/@ name」),因爲我不知道屬性的名稱。 – mron

+0

那麼你可以做第一個節點本身,包含所有的屬性?這將是我的第一個建議的結果:@ xmlColumn.query(「/ node()[1]」) – Frank