エラー処理 (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() 関数はサポートされません。