首页 > 解决方案 > 无法让 xml 粉碎在 SQL Server 2012 中从 XML 数据类型列到表中工作

问题描述

我没有得到任何结果,所以我做错了什么?

我已经尝试过这个论坛和技术文档中给出的示例。

这是在数据类型为OrderStatusResponse_2019的列中调用的表中Response_XML的数据XML。我正在尝试使用此代码获取此 xml 的结果类型。

DECLARE @Table TABLE (Response_XML XML)

INSERT INTO @Table (Response_XML) 
VALUES (<orderStatusSummaryReply xmlns="http://www.airversent.com/integration" transactionId="1" timestamp="2019-01-21T21:13:19.144Z">
  <result>
    <resultType>success</resultType>
  </result>
</orderStatusSummaryReply>)

SELECT
    XC.value('(resultType)[1]', 'NVARCHAR(10)') AS [ResultType]
FROM
    OrderStatusResponse_2019
CROSS APPLY
    Response_XML.nodes('/orderStatusSummaryReply/result') as T2(XC)

我得到 0 行返回。为什么?

我应该回到一排成功的地方。我得到0行。

标签: xmlsql-server-2012

解决方案


您的 XML 有一个默认命名空间。您需要指定它,否则查询将不起作用。

-- DDL and sample data population, start
DECLARE @tbl TABLE (ID INT IDENTITY(1,1) PRIMARY KEY, Response_XML XML);

INSERT INTO @tbl (Response_XML) 
VALUES (N'<orderStatusSummaryReply xmlns="http://www.airversent.com/integration" transactionId="1" timestamp="2019-01-21T21:13:19.144Z">
  <result>
    <resultType>success</resultType>
  </result>
</orderStatusSummaryReply>');
-- DDL and sample data population, end

;WITH XMLNAMESPACES(DEFAULT 'http://www.airversent.com/integration')
SELECT 
    ID,
    c.value('(resultType/text())[1]', 'VARCHAR(10)') AS [ResultType]
FROM 
    @tbl
CROSS APPLY 
    Response_XML.nodes('/orderStatusSummaryReply/result') AS t(c);

输出

+----+------------+
| ID | ResultType |
+----+------------+
|  1 | success    |
+----+------------+

推荐阅读