【问题标题】:Interpolating a variable into an XML node search将变量插入 XML 节点搜索
【发布时间】:2020-02-19 16:46:32
【问题描述】:

我正在尝试将变量插入 XML 节点查询,但我不知道语法。

这是我尝试过的:

declare @LineNumber int

select @LineNumber = 4

select T.value('(N4/F116)[1]','varchar(30)')
from @ClaimXML.nodes('/Envelope/Interchange/Group/Message/Loop2000/Loop2300/Loop2400[LX/F554=@LineNumber]/Loop2420') Trans(T)
where T.exist('NM1/F98_1[text()="PW"]') = 1

上面的查询不起作用,但如果我手动插入“4”而不是@LineNumber,它会起作用。如何正确插入@LineNumber 标量?

【问题讨论】:

标签: sql-server xml tsql


【解决方案1】:

只是为了在评论中添加解决方案,这里有一个测试示例:

DECLARE @xml XML=
'<root>
  <a id="1" value="a1"/>
  <a id="2" value="a2"/>
  <a id="3" value="a3"/>
  <a id="4" value="a4"/>
  <a id="5" value="a5"/>
  <a id="6" value="a6"/>
</root>';

--我们可以使用sql:variable() 将外部变量的值放入XPath:

DECLARE @SomeVariable INT=3;

SELECT @xml.value('(/root/a[@id=sql:variable("@SomeVariable")]/@value)[1]','char(2)')
--result: "a3"

--我们可以使用sql:column() 来使用(当前行的)列的值来做同样的事情:

DECLARE @tbl TABLE(SomeColumn INT);
INSERT INTO @tbl VALUES(1),(3),(6);

SELECT t.SomeColumn
      ,@xml.value('(/root/a[@id=sql:column("SomeColumn")]/@value)[1]','char(2)')
FROM @tbl t;

结果

1   a1
3   a3
6   a6

【讨论】:

    猜你喜欢
    • 2016-11-26
    • 1970-01-01
    • 2021-11-30
    • 1970-01-01
    • 1970-01-01
    • 2020-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多