我有一个带有此值的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行。如何输出所有值?
答案 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>