序列和 QName (XQuery)
适用范围:SQL Server
本主题介绍以下 XQuery 基本概念:
序列
QNames 和预定义命名空间
序列
在 XQuery 中,表达式的结果是由一系列 XML 节点和 XSD 原子类型的实例组成的序列。 序列中的单个项称为一项。 序列中的项可以是下列之一:
一个节点,如元素、属性、文本、处理指令、注释或文档
一个原子值,如 XSD 简单类型的实例
例如,下列查询构造了一个由两个元素节点项组成的序列:
SELECT Instructions.query('
<step1> Step 1 description goes here</step1>,
<step2> Step 2 description goes here </step2>
') AS Result
FROM Production.ProductModel
WHERE ProductModelID=7;
结果如下:
<step1> Step 1 description goes here </step1>
<step2> Step 2 description goes here </step2>
在上一个查询中,,
构造结尾的逗号 (<step1>
) 是序列构造符,是必需的。 结果中添加的空格只为说明使用,并且包含在本文档的所有示例结果中。
下面是应该了解的有关序列的其他信息:
如果某个查询导致了包含其他序列的一个序列,则被包含的序列将简化为容器序列。 例如,在数据模型中将序列 ((1,2, (3,4,5)),6) 简化成 (1, 2, 3, 4, 5, 6)。
DECLARE @x xml; SET @x = ''; SELECT @x.query('(1,2, (3,4,5)),6');
空序列是不包含任何项的序列。 它被表示为“()”。
只包含一项的序列可视为原子值,反之亦然。 也就是说,(1) = 1。
在这样的实现中,序列必须是同类的。 也就是说,您或者具有一个原子值序列,或者具有一个节点序列。 例如,下面是有效的序列:
DECLARE @x xml;
SET @x = '';
-- Expression returns a sequence of 1 text node (singleton).
SELECT @x.query('1');
-- Expression returns a sequence of 2 text nodes
SELECT @x.query('"abc", "xyz"');
-- Expression returns a sequence of one atomic value. data() returns
-- typed value of the node.
SELECT @x.query('data(1)');
-- Expression returns a sequence of one element node.
-- In the expression XML construction is used to construct an element.
SELECT @x.query('<x> {1+2} </x>');
下面的查询将返回一个错误,因为不支持异类序列。
SELECT @x.query('<x>11</x>, 22');
QName
XQuery 中的每个标识符都是一个 QName。 QName 由一个命名空间前缀和一个本地名称组成。 在这样的实现中,XQuery 中的变量名是 QNames,它们不能带有前缀。
请考虑以下示例,其中针对非类型化 xml 变量指定了查询:
DECLARE @x xml;
SET @x = '<Root><a>111</a></Root>';
SELECT @x.query('/Root/a');
在表达式 (/Root/a
) 中,Root
和 a
是 QNames。
在以下示例中,针对类型化的 xml 列指定查询。 查询循环访问第一个工作中心位置的所有 <步骤> 元素。
SELECT Instructions.query('
declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
for $Step in /AWMI:root/AWMI:Location[1]/AWMI:step
return
string($Step)
') AS Result
FROM Production.ProductModel
WHERE ProductModelID=7;
在查询表达式中,注意下列事项:
AWMI root
、AWMI:Location
、AWMI:step
和$Step
都是 QNames。AWMI
是一个前缀,root
、Location
和Step
都是本地名称。$step
变量是一个 QName 并且没有前缀。
以下命名空间是预定义的,用于 SQL Server 中的 XQuery 支持。
Prefix | URI |
---|---|
xs | http://www.w3.org/2001/XMLSchema |
xsi | http://www.w3.org/2001/XMLSchema-instance |
xdt | http://www.w3.org/2004/07/xpath-datatypes |
fn | http://www.w3.org/2004/07/xpath-functions |
(无前缀) | urn:schemas-microsoft-com:xml-sql |
sqltypes | https://schemas.microsoft.com/sqlserver/2004/sqltypes |
xml | http://www.w3.org/XML/1998/namespace |
(无前缀) | https://schemas.microsoft.com/sqlserver/2004/SOAP |
创建的每个数据库都有 sys XML 架构集合。 它包含着这些架构,以便可以从任何用户创建的 XML 架构集合中访问这些架构。
注意
此实现不支持 local
XQuery 规范 http://www.w3.org/2004/07/xquery-local-functions中所述的前缀。