主表达式 (XQuery)
适用范围:SQL Server
XQuery 主表达式包含文字、变量引用、上下文项表达式、构造函数和函数调用。
文本
XQuery 文字可以是数字或字符串。 字符串可包括预定义的实体引用,实体引用就是字符序列。 这种序列以“and”符为开头,此符号表示单个字符,如果不加此符号则可能具有语法意义。 以下是 XQuery 中的预定义的实体引用。
实体引用 | 表示 |
---|---|
< |
< |
> |
> |
& |
& |
" |
" |
' |
“ |
字符串还可以包含字符引用,对 Unicode 字符(由其十进制或十六进制码位标识)的 XML 样式的引用。 例如,欧元符号可以由字符引用“€”表示。
注意
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 > 50000 and < 100000</SalaryRange>')
GO
下面的示例阐释了使用字符引用来表示欧元符号。
DECLARE @var XML
SET @var = ''
SELECT @var.query(' <a>€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="https://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 数据类型实例中进行初始化。 也可以在 XPath 表达式或 [] 谓词的上下文中由 nodes() 方法更改。
上下文项由包含点 (.) 的表达式返回。 例如,以下查询评估每个元素<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 Server sql:variable() 和 sql:column() 函数。 有关已实现函数的列表,请参阅 针对 xml 数据类型的 XQuery 函数。
实现限制
实现限制如下:
不支持 XQuery prolog 中的函数声明。
不支持函数导入。