【问题标题】:SQL XML Attribute valueSQL XML 属性值
【发布时间】:2015-12-16 16:15:39
【问题描述】:

我试图弄清楚如何在元素名称更改时获取 XML 属性值。无论元素如何,属性都是相同的。

<obj1 id="1" name="sally" />
<obj2 id="15" date="yesterday" />

我一直在尝试各种形式的这个,但它不起作用:

SELECT 
   [OriginalRecordXml].value('(/./id)[1]', 'varchar(MAX)')
FROM [AuditRecords]

这可能吗?

【问题讨论】:

  • 查询 XML 是通过 XPath 表达式完成的,因此您需要显示您尝试查询的整个 XML 以获得正确的答案
  • 这两条记录几乎就是它们的样子。一个单独的 XML 记录存储在一个表列中,所以我们一次只能命中一个。
  • 你的意思是,每个标签为一行?
  • 是的,对不起。我应该更清楚。

标签: sql-server xml tsql xquery


【解决方案1】:

这样的事情可以解决问题:

declare @t table (
    Id int identity(1,1) primary key,
    XMLData xml not null
);

insert into @t (XMLData)
values (N'<obj1 id="1" name="sally" />
<obj2 id="15" date="yesterday" />'),
(N'<objM />');

select t.Id, x.c.value('./@id', 'varchar(max)')
from @t t
    cross apply t.XMLData.nodes('//*[@id]') x(c);

或者,如果您只需要来自第一个/单个节点的值,您可以节省一点:

select t.Id, t.XMLData.value('/*[@id][1]/@id', 'varchar(max)')
from @t t;

【讨论】:

  • 尝试这个:SELECT [OriginalRecordXml].value('./@ID_Trader', 'varchar(MAX)') FROM [FIRST].[dbo].[AuditRecords] 给出以下错误:XQuery [FIRST.dbo.AuditRecords.OriginalRecordXml.value()]: Top-level attribute nodes are not supported
  • @DanChampagne,更新了代码,以便它利用表作为源。如果您需要输出中的第二行(与选择标准不匹配,但无论如何),请将cross 替换为outer
  • 关于您在第一条注释中的特定代码,如果您没有在nodes() XML 方法中指定节点位置,则需要在value() 中提供完整路径。不过,我不确定通配符是否可以在这里使用。
  • 是的,确实如此。在答案中添加了第二个选项。
  • 所以第二个起作用了。有没有办法将 ID 字段放入变量中?我尝试了DECLARE @id varchar(20) = 'ID_Trader' .... x.c.value('(./@*[sql:variable("@id")])', 'varchar(MAX)'),,但我收到了一个错误。
猜你喜欢
  • 2021-11-24
  • 1970-01-01
  • 1970-01-01
  • 2014-03-23
  • 1970-01-01
  • 1970-01-01
  • 2018-07-24
  • 2012-10-06
  • 1970-01-01
相关资源
最近更新 更多