1

我有一个带有 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" />

当我使用此查询检索数据时,我得到 Nulls 而不是 ID 号

SELECT    before.value('ID[1]', 'int') ItemId
FROM dbo.Audit
CROSS APPLY Before.nodes('.') N(C) 

我哪里错了?

4

2 回答 2

1

这是一个属性,所以你必须在它前面加上前缀@,比如@ID. 属性必须始终以节点为前缀,因此 XPath 查询变为/row/@ID. 例如:

SELECT  Before.value('(/row/@ID)[1]', 'int') ItemId
FROM    Audit

据我所知,这里没有必要cross apply

SQL Fiddle 上的实时示例。

于 2012-06-25T09:34:25.213 回答
0

您需要将其更改为:

SELECT before.value('@ID[1]', 'int') ItemId
FROM @Audit
CROSS APPLY Before.nodes('/row') N(C)

用于.nodes('/row')选择<row>节点 - 并用于@ID选择 XML 属性。

但是,使用这个,你会得到一个错误:

消息 2390,级别 16,状态 1,第 6 行
XQuery [@Audit.before.value()]:不支持顶级属性节点

由于您的 XML 中只有一个<row>元素(这是正确的,对吗?),您可以使用它来代替:

SELECT 
    before.value('(row/@ID)[1]', 'int') ItemId
FROM dbo.Audit
于 2012-06-25T09:31:02.003 回答