显然,我有一个名为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>
发布于 2018-10-11 10:11:40
如果我正确地理解了您,您希望在您的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()
是<value>
在<row>
下面的XML,它填充了过滤器。拿着这个node()
,从那里读.value()
。
这将被传递到JSON_VALUE
中,以便检索所需的deliveryId
。
您可以对属性id
进行同样的操作,还可以使用解密变量(sql:variable()
)或结果集(sql:column()
)中的列提交值。
https://stackoverflow.com/questions/52750714
复制相似问题