替换 XML 命名空间以使用 XQUERY
Replacing XML namespace to use XQUERY
我在 table 的其中一列中有一个示例输入,如下所示。
<OrderNotification xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<POSKI xmlns="http://MyCompany.co.nz">12345</POSKI>
<BUKRS xmlns="http://MyCompany.co.nz">ABCD</BUKRS>
<PRCTR xmlns="http://MyCompany.co.nz">1324</PRCTR>
</OrderNotification>
我需要切碎此 XML 以从消息中提取值。但是,由于子节点中的名称空间,我无法这样做。根据我上一个问题的建议,我写下了我的查询。
DECLARE @OrderLogs TABLE ( OrderNotification XML);
INSERT INTO @ProjectLogs (OrderNotification)
(SELECT Info
FROM [MainLogging].[dbo].[JobLogs]
WHERE EventId = 'XXXXXXXX'
AND Message ='OrderNotification');
WITH XMLNAMESPACES (DEFAULT 'http://mycompany.co.nz')
SELECT
c.value('(POSKI/text())[1]','VARCHAR(20)') AS ORDER,
c.value('(BUKRS/text())[1]','VARCHAR(256)') AS DESCRIPTION
FROM
@ProjectLogs
CROSS APPLY
OrderNotification.nodes('/OrderNotification') AS t(c);
它没有返回任何输出,因为我没有正确引用节点。有人可以帮忙吗?
提前致谢
请尝试以下解决方案。
SQL
-- DDL and sample data population, start
DECLARE @tbl TABLE (ID INT IDENTITY PRIMARY KEY, OrderNotification XML);
INSERT INTO @tbl (OrderNotification ) VALUES
(N'<OrderNotification xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<POSKI xmlns="http://MyCompany.co.nz">12345</POSKI>
<BUKRS xmlns="http://MyCompany.co.nz">ABCD</BUKRS>
<PRCTR xmlns="http://MyCompany.co.nz">1324</PRCTR>
</OrderNotification>');
-- DDL and sample data population, end
WITH XMLNAMESPACES ('http://MyCompany.co.nz' AS ns1)
SELECT ID
, c.value('(ns1:BUKRS/text())[1]','VARCHAR(20)') AS BUKRS
, c.value('(ns1:POSKI/text())[1]','VARCHAR(256)') AS POSKI
, c.value('(ns1:PRCTR/text())[1]','VARCHAR(256)') AS PRCTR
FROM @tbl
CROSS APPLY OrderNotification.nodes('/OrderNotification') AS t(c);
输出
+----+-------+-------+-------+
| ID | BUKRS | POSKI | PRCTR |
+----+-------+-------+-------+
| 1 | ABCD | 12345 | 1324 |
+----+-------+-------+-------+
我在 table 的其中一列中有一个示例输入,如下所示。
<OrderNotification xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<POSKI xmlns="http://MyCompany.co.nz">12345</POSKI>
<BUKRS xmlns="http://MyCompany.co.nz">ABCD</BUKRS>
<PRCTR xmlns="http://MyCompany.co.nz">1324</PRCTR>
</OrderNotification>
我需要切碎此 XML 以从消息中提取值。但是,由于子节点中的名称空间,我无法这样做。根据我上一个问题的建议,我写下了我的查询。
DECLARE @OrderLogs TABLE ( OrderNotification XML);
INSERT INTO @ProjectLogs (OrderNotification)
(SELECT Info
FROM [MainLogging].[dbo].[JobLogs]
WHERE EventId = 'XXXXXXXX'
AND Message ='OrderNotification');
WITH XMLNAMESPACES (DEFAULT 'http://mycompany.co.nz')
SELECT
c.value('(POSKI/text())[1]','VARCHAR(20)') AS ORDER,
c.value('(BUKRS/text())[1]','VARCHAR(256)') AS DESCRIPTION
FROM
@ProjectLogs
CROSS APPLY
OrderNotification.nodes('/OrderNotification') AS t(c);
它没有返回任何输出,因为我没有正确引用节点。有人可以帮忙吗?
提前致谢
请尝试以下解决方案。
SQL
-- DDL and sample data population, start
DECLARE @tbl TABLE (ID INT IDENTITY PRIMARY KEY, OrderNotification XML);
INSERT INTO @tbl (OrderNotification ) VALUES
(N'<OrderNotification xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<POSKI xmlns="http://MyCompany.co.nz">12345</POSKI>
<BUKRS xmlns="http://MyCompany.co.nz">ABCD</BUKRS>
<PRCTR xmlns="http://MyCompany.co.nz">1324</PRCTR>
</OrderNotification>');
-- DDL and sample data population, end
WITH XMLNAMESPACES ('http://MyCompany.co.nz' AS ns1)
SELECT ID
, c.value('(ns1:BUKRS/text())[1]','VARCHAR(20)') AS BUKRS
, c.value('(ns1:POSKI/text())[1]','VARCHAR(256)') AS POSKI
, c.value('(ns1:PRCTR/text())[1]','VARCHAR(256)') AS PRCTR
FROM @tbl
CROSS APPLY OrderNotification.nodes('/OrderNotification') AS t(c);
输出
+----+-------+-------+-------+
| ID | BUKRS | POSKI | PRCTR |
+----+-------+-------+-------+
| 1 | ABCD | 12345 | 1324 |
+----+-------+-------+-------+