从xml列sql中检索数据

时间:2012-06-25 09:26:35

标签: sql-server xml xquery

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

我哪里错了?

2 个答案:

答案 0 :(得分:1)

这是一个属性,因此您必须在@前加@ID,如/row/@ID。属性必须始终以节点为前缀,因此XPath查询变为SELECT Before.value('(/row/@ID)[1]', 'int') ItemId FROM Audit 。例如:

cross apply

据我所知,这里不需要{{1}}。

Live example at SQL Fiddle.

答案 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