迭代XML节点,然后检查是否有匹配的json值,然后选择该值

迭代XML节点,然后检查是否有匹配的json值,然后选择该值,json,sql-server,xml,tsql,xquery,Json,Sql Server,Xml,Tsql,Xquery,显然,我有一个字段调用Data,它在这些节点中存储一些xml节点+json 我可以使用以下方法检索deliveryID: JSON_VALUE(ml.Data.value('(/row/value)[2]', 'NVARCHAR(MAX)'),'$.transactions[0].deliveryId') deliveryID 但是,事务可能并不总是在它的第二个节点上, 它可以在任何一排 是否有其他方法可以迭代该节点并查找其内部是否有json事务,然后从该行获取deliveryID 谢谢 &

显然,我有一个字段调用Data,它在这些节点中存储一些xml节点+json

我可以使用以下方法检索deliveryID:

JSON_VALUE(ml.Data.value('(/row/value)[2]', 'NVARCHAR(MAX)'),'$.transactions[0].deliveryId') deliveryID 
但是,事务可能并不总是在它的第二个节点上, 它可以在任何一排

是否有其他方法可以迭代该节点并查找其内部是否有json事务,然后从该行获取deliveryID

谢谢

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

17
17
3083 2614 5022 21321
jello@anc.com
{“交易”:[{“英国石油公司通信协议”:“V001”,“英国石油公司要约到期”:“2018-10-01T00:00:00”,“交货ID”:“20320925”,“工作编号”:“A34F443”,“发送日期”:“2018-09-26T00:00:00”}]

如果我没有弄错,您希望在
元素中找到一个
JSON
,并从中读取
交付ID

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>';
--相同的方法,但查看属性
显示名称

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()

这被传递到
JSON\u值中
,以便检索所需的
deliveryId


您可以对属性
id
执行相同的操作,您可以使用declard变量(
sql:variable()
)或从结果集中的一列(
sql:column()
)提交值。

顺便说一句:我希望这不是真实的数据。。。
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');