エラー処理 (XQuery)

W3C の仕様では、型エラーが静的または動的に発生することを許可し、静的エラー、動的エラー、および型エラーを定義しています。

コンパイルとエラー処理

XQuery 式や XML DML ステートメントの構文が誤っている場合は、コンパイル エラーが返されます。コンパイル フェーズでは、XQuery 式や DML ステートメントの静的な型が正しいことが確認され、XML スキーマを使用して型指定された XML にするための型の推定が行われます。型の安全性違反により実行時に式が失敗する可能性がある場合は、静的な型エラーが発生します。静的なエラーの例には、整数への文字列の追加、存在しないノードに対する型指定されたデータのクエリの実行などがあります。

W3C 標準からは外れますが、XQuery の実行時エラーは空のシーケンスに変換されます。この空のシーケンスは、呼び出し時の状況に応じ、空の XML または NULL としてクエリの結果に反映される場合があります。

実行時のキャスト エラーは空のシーケンスに変換されますが、明示的に正しい型にキャストすることで静的なエラーを回避できます。

静的エラー

静的エラーは Transact-SQL エラー メカニズムを使用して返されます。SQL Server では、XQuery の型エラーが静的に返されます。詳細については、「XQuery と静的な型指定」を参照してください。

動的エラー

XQuery では、ほとんどの動的エラーが空のシーケンス ("()") にマップされます。ただし、XQuery 集計関数でオーバーフローが発生する場合および XML-DML 検証エラーは例外です。ほとんどの動的エラーは空のシーケンスにマップされることに注意してください。動的エラーが空のシーケンスにマップされない場合、XML インデックスを利用するクエリの実行で予期しないエラーが発生する可能性があります。そのため、SQL Server データベース エンジンでは、予期しないエラーを発生させることなくクエリを効率的に実行するため、動的エラーが () にマップされます。

() は False にマップされています。そのため、多くの場合、述語内で動的エラーが発生する状況では、エラーが発生しないとセマンティクスは変更されません。ただし、動的エラーではなく () を返すと予期しない結果が生じることがあります。このことを示す例を次に挙げます。

例 : 文字列に対する avg() 関数の使用

次の例では、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(//*)')

例 : not 関数の使用

たとえば、/SomeNode[not(Expression)] のように述語で not 関数を使用すると、この式では動的エラーが発生し、エラーではなく空のシーケンスが返されます。空のシーケンスに not() を適用すると、エラーではなく True が返されます。

例 : 文字列のキャスト

次の例では、リテラル文字列 "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() 関数はサポートされません。