主表达式 (XQuery)

XQuery 主表达式包括文字、变量引用、上下文项表达式、构造函数和函数调用。

文字

XQuery 文字可以是数字或字符串。字符串可包括预定义的实体引用,实体引用就是字符序列。这种序列以“and”符为开头,此符号表示单个字符,如果不加此符号则可能具有语法意义。以下是 XQuery 中的预定义的实体引用。

实体引用

表示

<

<

&gt;

>

&amp;

&

&quot;

"

&apos;

'

字符串还可以包含字符引用,对 Unicode 字符(由其十进制或十六进制码位标识)的 XML 样式的引用。例如,Euro 符号可以由字符引用“&#8364;”来表示。

注意注意

SQL Server 使用 XML 1.0 版作为分析基础。

示例

以下示例说明了文字、实体引用以及字符引用的用法。

此代码将返回错误,因为 <' 和 '> 字符具有特殊含义。

DECLARE @var XML
SET @var = ''
SELECT @var.query(' <SalaryRange>Salary > 50000 and < 100000</SalaryRange>')
GO

如果改为使用实体引用,则查询将起作用。

DECLARE @var XML
SET @var = ''
SELECT @var.query(' <SalaryRange>Salary &gt; 50000 and &lt; 100000</SalaryRange>')
GO

下面的示例阐释了使用字符引用来表示欧元符号。

DECLARE @var XML
SET @var = ''
SELECT @var.query(' <a>&#8364;12.50</a>')

结果如下:

<a>€12.50</a>

在以下示例中,查询被撇号分隔开了。因此,字符串值中的撇号用两个相邻的撇号来表示。

DECLARE @var XML
SET @var = ''
SELECT @var.query('<a>I don''t know</a>')
Go

结果如下:

<a>I don't know</a>

可以使用内置布尔函数 true() 和 false() 来表示布尔值,如以下示例所示。

DECLARE @var XML
SET @var = ''
SELECT @var.query('<a>{true()}</a>')
GO

直接的元素构造函数在大括号中指定一个表达式。在生成的 XML 中,此表达式将被其值替代。

结果如下:

<a>true</a>

变量引用

XQuery 中的变量引用是以 $ 符号为前缀的 QName。此实现只支持不带前缀的变量引用。例如,下面的查询在 FLWOR 表达式中定义了变量 $i。

DECLARE @var XML
SET @var = '<root>1</root>'
SELECT @var.query('
 for $i in /root return data($i)')
GO

下面的查询将不起作用,因为在变量名称中添加了命名空间前缀。

DECLARE @var XML
SET @var = '<root>1</root>'
SELECT @var.query('
DECLARE namespace x="http://X";
for $x:i in /root return data($x:i)')
GO

可以使用 sql:variable() 扩展函数来引用 SQL 变量,如下面的查询所示。

DECLARE @price money
SET @price=2500
DECLARE @x xml
SET @x = ''
SELECT @x.query('<value>{sql:variable("@price") }</value>')

结果如下:

<value>2500</value>

实现限制

实现限制如下:

  • 不支持带有命名空间前缀的变量。

  • 不支持模块导入。

  • 不支持外部变量声明。解决此问题的方法是使用 sql:variable() 函数

上下文项表达式

上下文项是路径表达式的上下文中当前正在处理的项。该项在带有文档节点的非空 XML 数据类型实例中进行初始化。还可以使用 nodes() 方法在 XPath 表达式或 [] 谓词的上下文中对其进行更改。

上下文项由包含点 (.) 的表达式返回。例如,下面的查询将计算每个元素 <a>,以确定是否存在属性 attr。如果存在此属性,则返回该元素。请注意,谓词中的条件指定使用单个句点指定上下文节点。

DECLARE @var XML
SET @var = '<ROOT>
<a>1</a>
<a attr="1">2</a>
</ROOT>'
SELECT @var.query('/ROOT[1]/a[./@attr]')

结果如下:

<a attr="1">2</a>

函数调用

您可以调用内置 XQuery 函数和 SQL Serversql:variable() 以及 sql:column() 函数。有关一些已实现的函数的详细信息,请参阅针对 xml 数据类型的 XQuery 函数

实现限制

实现限制如下:

  • 不支持 XQuery prolog 中的函数声明。

  • 不支持函数导入。

请参阅

概念