我有一个带有xml类型列的表(列名是Before) 这是一个数据样本
<row ID="47" By="Test User" Date="2006-07-26T00:00:00" Status="Closed"
Closed_Date="2012-06-22T11:14:35.237" Closed_By="MrBig" />
当我使用此查询来检索数据时,我得到的是Null而不是ID号
SELECT before.value('ID[1]', 'int') ItemId
FROM dbo.Audit
CROSS APPLY Before.nodes('.') N(C)
我哪里错了?
答案 0 :(得分:1)
这是一个属性,因此您必须在@
前加@ID
,如/row/@ID
。属性必须始终以节点为前缀,因此XPath查询变为SELECT Before.value('(/row/@ID)[1]', 'int') ItemId
FROM Audit
。例如:
cross apply
据我所知,这里不需要{{1}}。
答案 1 :(得分:0)
您需要将其更改为:
SELECT before.value('@ID[1]', 'int') ItemId
FROM @Audit
CROSS APPLY Before.nodes('/row') N(C)
使用.nodes('/row')
选择<row>
节点 - 并使用@ID
选择XML属性。
但是,使用此功能,您将收到错误消息:
Msg 2390,Level 16,State 1,Line 6
XQuery [@ Audit.before.value()]:不支持顶级属性节点
由于您的XML中只有一个<row>
元素(这是正确的,对吗?),您可以改用它:
SELECT
before.value('(row/@ID)[1]', 'int') ItemId
FROM dbo.Audit