Интерполяция переменной в поиск узла XML - PullRequest
0 голосов
/ 19 февраля 2020

Я пытаюсь вставить переменную в запрос узла 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?

1 Ответ

1 голос
/ 19 февраля 2020

Просто добавьте к решению в комментарии вот пример, чтобы проверить это:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...