首页 > 解决方案 > SQL Server XML 查询中的 nodes() 返回什么类型

问题描述

如果我有 XML 类型的 SQL 变量,则可以直接将其用作 SELECT 子句的列(即使该值是没有单个根元素的 XML 片段)

DECLARE @Items XML
SET @Items = '<item>one</item><item>two</item>'
SELECT @Items

然而,当我使用该函数以任何方式分解该 XML 变量时nodes(),SQL Server 抱怨说

SELECT Items.Item FROM @Items.nodes('/') AS Items (Item)
-- The column 'Item' that was returned from the nodes() method cannot be used directly. It can only be used with one of the four XML data type methods, exist(), nodes(), query(), and value(), or in IS NULL and IS NOT NULL checks.

当我按照错误消息中包含的提示进行操作时,这很好

SELECT Items.Item.query('.') FROM @Items.nodes('/') AS Items (Item)
SELECT Items.Item.query('.') FROM @Items.nodes('//item') AS Items (Item)

但如果不使用其中一种“XML 数据类型”方法,我什至无法将结果转换回 XML。

SELECT CAST(Items.Item AS XML) FROM @Items.nodes('/') AS Items (Item)
-- The column that was returned from the nodes() method cannot be converted to the data type xml. It can only be used with one of the four XML data type methods, exist(), nodes(), query(), and value(), or in IS NULL and IS NOT NULL checks.

该列的数据类型是什么Items.Item,为什么我不能在不涉及其他方法的情况下将其用作 XML(当显然可以直接选择 XML 数据类型的列时?)

标签: sql-serverxqueryxquery-sql

解决方案


官方文档说它是一个rowset。这是它的摘录:

nodes() 方法的结果是包含原始 XML 实例的逻辑副本的行集。在这些逻辑副本中,每个行实例的上下文节点都设置为使用查询表达式标识的节点之一。这样,以后的查询可以相对于这些上下文节点进行导航。

nodes() 方法(xml 数据类型)


推荐阅读