エラー処理 (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 関数を呼び出して 3 つの値の平均を計算します。これらの値の 1 つは文字列です。この XML インスタンスは型指定されていないので、XML インスタンス内のすべてのデータは型指定されていないアトミック型になります。avg() 関数では、これらの値を xs:double にキャストしてから、値の平均を計算します。ただし、値 "Hello"
は xs:double にキャストできないので、動的エラーが生成されます。この場合、xs:double への "Hello"
のキャストにより、動的エラーではなく、空のシーケンスが返されます。avg() 関数では、この値は無視され、他の 2 つの値の平均が計算されて、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
たとえば、/SomeNode[not(Expression)]
のように述語で not 関数を使用すると、この式では動的エラーが発生し、エラーではなく空のシーケンスが返されます。空のシーケンスに 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() 関数はサポートされません。