2011-10-31 122 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