需要帮助以从XML中获取价值

时间:2019-09-17 16:09:11

标签: xml tsql

这是我第一次在这里发帖。因此,如果我没有以正确的方式提出要求,我会提前道歉。

我一直在尝试构建一个查询,该查询将基于特定条件在XML中返回某个值。

Screenshot of table where my XML is (xml_bot column)

Screenshot of XML structure

我没有处理SQL中的XML的经验,也无法使用我在其他帖子中找到的方法来使它正常工作。我尝试的最新版本是以下内容,但是如您所见,我只是想让某些东西返回,以至少确保查询找到了东西

--filtering XML data using XQuery
;WITH XMLNAMESPACES 
('http://www.harlandfs.com/namespaces/hfs/openpath/wrapper/2.0#' AS ns)
SELECT COUNT(1)
FROM bde_xml
WHERE xml_bot.exist('(/ns:HFS_MISMORequest/ns:MESSAGE/ns:MESSAGE_DELIVERY_INFORMATION/ns:OriginalMessageIdentifier[.="1090020"])')=1
and application_id = 1522
GO

我要做的就是根据应用程序的添加返回OriginalMessageIdentifier节点(在本例中为123456)的内容:

select [value within OriginalMessageIdentifier node]
from bde_xml
where application_id = 1522

结果将是:123456

                                  11111111           123456           https://thisisatest.com                        

我最大的挣扎是与OriginalMessageIdentifier之前的几个节点以及它们如何声明ns。

有人能指出我正确的方向吗? 预先谢谢你!

1 个答案:

答案 0 :(得分:1)

首先,对于这种情况,您可以通过包含实际代码而不是屏幕快照来更快地获得帮助。在处理名称空间时,您可以(通常)使用“任何名称空间”语法作弊,或者可以像详细的here那样进行显式显示。

在处理单个XML对象时,这就是我们所需要的内容:

DECLARE @XML XML =
'<s:Envelope xmlns:s="http://whatever">
  <s:Body xmlns:xsi="http://yyy.xyz.com">
    <HFS_BLAH_BLAH xmlns="http://123.456.999">
      <OriginalMessageID>12345</OriginalMessageID>
    </HFS_BLAH_BLAH>
  </s:Body>
</s:Envelope>';

SELECT @XML.value('(//*:OriginalMessageID/text())[1]', 'int');

针对表,因为您要返回单个原子值,所以可以执行以下操作:

-- Sample data
DECLARE @yourtable TABLE (someId INT Identity, SomeXML XML);
INSERT @yourtable (SomeXML)
VALUES
('<s:Envelope xmlns:s="http://whatever">
  <s:Body xmlns:xsi="http://yyy.xyz.com">
    <HFS_BLAH_BLAH xmlns="http://123.456.999">
      <OriginalMessageID>12345</OriginalMessageID>
    </HFS_BLAH_BLAH>
  </s:Body>
</s:Envelope>'),
('<s:Envelope xmlns:s="http://whatever">
  <s:Body xmlns:xsi="http://zzz.xyz.com">
    <HFS_BLAH_BLAH xmlns="http://123.456.999">
      <OriginalMessageID>999666333</OriginalMessageID>
    </HFS_BLAH_BLAH>
  </s:Body>
</s:Envelope>');

-- Solution
SELECT t.someId, OId = t.SomeXML.value('(//*:OriginalMessageID/text())[1]', 'int')
FROM @yourtable AS t;

返回哪个:

someId      OId
----------- -----------
1           12345
2           999666333