使用条件在 T-SQL 中搜索 XML

Searching through XML in T-SQL with conditions

我正在尝试根据条件将 XML 数据类型的正确信息转换为常规标量变量,但是我无法取回正确的信息。

这是我正在搜索的XML:

<Loop2420>
                <NM1>
                  <F98_1>PW</F98_1>
                  <F1065>2</F1065>
                </NM1>
                <N3>
                  <F166>81715 DOCTOR CARRE</F166>
                </N3>
                <N4>
                  <F19>INDIO</F19>
                  <F156>CA</F156>
                  <F116>92201</F116>
                </N4>
              </Loop2420>
              <Loop2420>
                <NM1>
                  <F98_1>45</F98_1>
                  <F1065>2</F1065>
                </NM1>
                <N3>
                  <F166>51250 MECCA AVE</F166>
                </N3>
                <N4>
                  <F19>COACHELLA</F19>
                  <F156>CA</F156>
                  <F116>92236</F116>
                </N4>
              </Loop2420>

基本上我需要从 <'F116'> 获取数字,但前提是 <'F98_1'> 等于 'PW'.

我试过:

declare @zip varchar(30)
select @zip = T.value('(F116)[1]','varchar(30)')
        from @TransactionXML.nodes('/Loop2420/N4') Trans(T)
        where T.value('(/Loop2420/NM1/F98_1)[1]','varchar(30)') = 'PW'

但有时 returns 来自 <'F116'> 的值,即使 <'F98_1'> 等于“45”。

有什么建议吗?谢谢

将测试放入 XQuery 本身并将其固定到您正在检查的节点:

SELECT @zip = T.value('(N4/F116)[1]', 'varchar(30)')
FROM @TransactionXML.nodes('/Loop2420') Trans(T)
WHERE T.exist('NM1/F98_1[text()="PW"]') = 1

如果 PW 不是静态值,请使用 sql:variable()sql:column() 函数将其合并到查询中。