从XML列获取值

时间:2012-03-05 02:58:01

标签: sql-server-2008

我有一个带有此值的XML列

<sso_links>
   <linktype>mytype</linktype>
   <url>http://mydomain.com</url>
   <linktype>mytype2</linktype>
   <url>http://somedomain.com</url>
</sso_links>

我尝试使用SQL按值查询,但这只返回标量类型

SELECT XMLCOLUMN.value('//linktype[1]', varchar(max)),
XMLCOLUMN.value('//url[1]', varchar(max))
from table
where someid = '1'

这从XML产生了2行。如何输出所有值?

2 个答案:

答案 0 :(得分:1)

创建表

CREATE TABLE docs (pk INT PRIMARY KEY, xCol XML not null)

插入值

INSERT INTO docs VALUES (1, '<sso_links>
<linktype>mytype</linktype>
<url>http://mydomain.com</url>
<linktype>mytype2</linktype>
<url>http://somedomain.com</url>
</sso_links>')

现在选择您想要的值

SELECT xCol.value('(/sso_links//linktype/node())[1]', 'nvarchar(max)') AS linktype
      ,xCol.value('(/sso_links//url/node())[1]', 'nvarchar(max)') AS url
      ,xCol.value('(/sso_links//linktype/node())[2]', 'nvarchar(max)') AS linktype2
      ,xCol.value('(/sso_links//url/node())[2]', 'nvarchar(max)') AS url2
  FROM docs 
 WHERE pk = 1

试一试!

答案 1 :(得分:1)

如果您想要一个“通用”版本来解析<sso_links>下的所有子节点并生成它们的名称和值,请使用以下内容:

SELECT 
    NodeName = node.value('local-name(.)', 'varchar(100)'),
    NodeValue = node.value('(.)[1]', 'varchar(200)')
FROM
    dbo.YourTable
CROSS APPLY 
    XmlColumn.nodes('/sso_links/*') AS links(node)
WHERE 
    SomeID = 1

对于您的示例XML,我得到一个输出:

NodeName    NodeValue
linktype    mytype
url         http://mydomain.com
linktype    mytype2
url         http://somedomain.com

由于它不使用特定的节点名称或索引,因此适用于<sso_links>

下的任意数量的子节点