这是我第一次在这里发帖。因此,如果我没有以正确的方式提出要求,我会提前道歉。
我一直在尝试构建一个查询,该查询将基于特定条件在XML中返回某个值。
Screenshot of table where my XML is (xml_bot column)
我没有处理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。
有人能指出我正确的方向吗? 预先谢谢你!
答案 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