Выполните итерацию по узлу XML, затем проверьте, соответствует ли значение json, затем выберите значение - PullRequest
0 голосов
/ 11 октября 2018

Очевидно, у меня есть вызов поля Данные , в котором хранится некоторый xml-узел + json внутри этих узлов.

Я могу получить идентификатор доставки с помощью:

JSON_VALUE(ml.Data.value('(/row/value)[2]', 'NVARCHAR(MAX)'),'$.transactions[0].deliveryId') deliveryID 

Однако транзакции не всегда могут быть во втором узле, они могут быть в любой строке.

Есть ли какой-либо другой способ, которым я могу сделать, чтобы выполнить итерацию узла и найти, есть ли внутри него транзакции jsonзатем получить идентификатор доставки из строки?

Спасибо

<row>
  <value id="1ae95d67-599e-4ab6-9ffd-08d4d90ab608" display-name="Cardholder_id" data-type="Int32">17</value>
  <value id="1ae95d67-599e-4ab6-9ffd-08d4d90ab608" display-name="Cardholder_id" data-type="Int32">17</value>
  <value id="eb71fd46-f0b2-401d-9775-08d4d90ab608" display-name="Card_Number">3083 2614 5022 21321</value>
  <value id="4fc261b2-f776-4fd4-8e1d-08d4d90ab608" display-name="Email_Address">jello@anc.com</value>
  <value id="c867d4e5-cc0b-4ee6-b911-08d6134132e0" display-name="BP_TRIGGERS_2.0">{"transactions":[{"BP_CommsRef":"V0001","BP_Offer_Expiry":"2018-10-01T00:00:00","deliveryId":"20320925","Job_Number":"A34F443","Send_Date":"2018-09-26T00:00:00"}]}</value>
</row>

1 Ответ

0 голосов
/ 11 октября 2018

Если я вас правильно понял, вы хотите найти JSON в ваших <value> элементах и ​​прочитать оттуда deliverId:

Declare @XML xml = '
<row>
  <value id="1ae95d67-599e-4ab6-9ffd-08d4d90ab608" display-name="Cardholder_id" data-type="Int32">17</value>
  <value id="1ae95d67-599e-4ab6-9ffd-08d4d90ab608" display-name="Cardholder_id" data-type="Int32">17</value>
  <value id="eb71fd46-f0b2-401d-9775-08d4d90ab608" display-name="Card_Number">3083 2614 5022 21321</value>
  <value id="4fc261b2-f776-4fd4-8e1d-08d4d90ab608" display-name="Email_Address">jello@anc.com</value>
  <value id="c867d4e5-cc0b-4ee6-b911-08d6134132e0" display-name="BP_TRIGGERS_2.0">{"transactions":[{"BP_CommsRef":"V0001","BP_Offer_Expiry":"2018-10-01T00:00:00","deliveryId":"20320925","Job_Number":"A34F443","Send_Date":"2018-09-26T00:00:00"}]}</value>
</row>';

- это проверит на открытие { (вы также можете найти открытие {"transactions")

SELECT JSON_VALUE(
       @XML.query(N'/row/value[substring(text()[1],1,1)="{"]/node()')
       .value(N'text()[1]','nvarchar(max)')
       ,N'$.transactions[0].deliveryId');

- тот же подход, но с учетом атрибута display-name

SELECT JSON_VALUE(
       @XML.query(N'/row/value[@display-name="BP_TRIGGERS_2.0"]/node()')
       .value(N'text()[1]','nvarchar(max)')
       ,N'$.transactions[0].deliveryId');

Идея вкратце: .query() XML для <value> ниже <row>, который заполняет фильтр.Возьмите это node() и прочитайте оттуда .value().
Это передается в JSON_VALUE для получения необходимого deliveryId.

Вы можете сделать то же самое с атрибутом id и вы можете передать значения с помощью переменной declard (sql:variable()) или из столбца в наборе результатов (sql:column()).

...