Поиск по XML в T- SQL с условиями - PullRequest
0 голосов
/ 20 января 2020

Я пытаюсь получить правильную информацию из типа данных XML в обычные скалярные переменные в зависимости от условий, однако у меня возникают проблемы с получением правильной информации.

Вот XML I Я ищу:

<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'

Но иногда это возвращает значение из <'F116'>, даже если <'F98_1'> равно '45'.

Есть предложения? Спасибо.

1 Ответ

0 голосов
/ 20 января 2020

Поместите тест в сам 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 не является значением c, используйте sql:variable() или sql:column() функция для включения его в запрос.

...