错误处理 (XQuery)

W3C 规范允许静态或动态引发类型错误,并定义静态错误、动态错误和类型错误。

静态错误

静态错误是通过使用 Transact-SQL 错误机制返回的。在 SQL Server 中,XQuery 类型错误是静态返回的。有关详细信息,请参阅 XQuery 与静态类型化

动态错误

在 XQuery 中,大部分动态错误都映射到一个空序列(即“()”)。不过,有两个例外:XQuery 聚合函数中的溢出条件和 XML-DML 验证错误。请注意,大部分动态错误都映射到一个空序列。另外,使用 XML 索引的查询执行可能引发错误。因此,为了能够有效地执行索引而不生成意外错误,SQL Server 2005 数据库引擎 会将动态错误映射到 ()。

通常,在谓词内出现动态错误的情况下,不引发错误就不会更改语义,因为 () 映射到 False。但是,在某些情况下,返回 () 而不返回动态错误可能导致意外结果。下列示例说明了这一点。

示例 A

请思考下面的查询:

DECLARE @x xml
SET @x='<a>Hello</a>'
SELECT @x.query('xs:double(/a[1])')

表达式 xs:double(/a[1]) 导致动态错误。在运行时将 string() 函数返回的字符串转换为 double 会生成动态错误。该查询返回一个空序列,而不返回该错误。

示例 B

在下面的示例中,调用 avg 函数计算三个值的平均值。这些值中的一个是字符串。由于此情况下的 XML 实例是非类型化的,因此其中的所有数据都是非类型化的原子类型。计算平均值之前,avg() 函数首先将这些值转换为 xs:double。但是,无法将值 "Hello" 转换为 xs:double,而生成动态错误。在这种情况下,将 "Hello" 转换为 xs:double 会生成一个空序列,而不是返回动态错误。avg() 函数将忽略此值,计算另两个值的平均值,然后返回 150。

DECLARE @x xml
SET @x=N'<root xmlns:myNS="test">
 <a>100</a>
 <b>200</b>
 <c>Hello</c>
</root>'
SELECT @x.query('avg(//*)')

示例 C

在谓词中使用 not 函数(例如 /SomeNode[not(Expression)])时,该表达式将导致动态错误,但返回一个空序列,而不返回错误。将 not() 应用于空序列将返回 True,而不返回错误。

示例 D

在下面的示例中,文字字符串“NaN”先转换为 xs:string,再转换为 xs:double。结果是一个空行集。虽然字符串“NaN”无法成功转换为 xs:double,但直到运行时才能确定,因为该字符串首先转换为 xs:string。

DECLARE @x XML
SET @x = ''
SELECT @x.query(' xs:double(xs:string("NaN")) ')
GO

不过,在此示例中,生成一个静态类型错误。

DECLARE @x XML
SET @x = ''
SELECT @x.query(' xs:double("NaN") ')
GO

实现限制

不支持 fn:error() 函数。

请参阅

概念

XQuery 基础知识

其他资源

针对 xml 数据类型的 XQuery

帮助和信息

获取 SQL Server 2005 帮助