Если я вас правильно понял, вы хотите найти 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()
).