エラー処理 (XQuery)
適用対象:SQL Server
W3C 仕様では、型エラーを静的または動的に発生させ、静的、動的、および型のエラーを定義します。
コンパイルとエラー処理
XQuery 式や XML DML ステートメントの構文が誤っている場合は、コンパイル エラーが返されます。 コンパイル フェーズでは、XQuery 式と DML ステートメントの静的な型の正確性がチェックされ、型指定された XML の型推論に XML スキーマが使用されます。 型の安全性違反により実行時に式が失敗する可能性がある場合は、静的な型エラーが発生します。 静的なエラーの例には、整数への文字列の追加、存在しないノードに対する型指定されたデータのクエリの実行などがあります。
W3C 標準からの逸脱として、XQuery ランタイム エラーは空のシーケンスに変換されます。 この空のシーケンスは、呼び出し時の状況に応じ、空の XML または NULL としてクエリの結果に反映される場合があります。
正しい型に明示的にキャストすると、ユーザーは静的エラーを回避できますが、ランタイム キャスト エラーは空のシーケンスに変換されます。
静的エラー
静的エラーは、Transact-SQL エラー メカニズムを使用して返されます。 SQL Serverでは、XQuery 型エラーは静的に返されます。 詳細については、「 XQuery と静的な型指定」を参照してください。
動的エラー
XQuery では、ほとんどの動的エラーが空のシーケンス ("()") にマップされます。 ただし、XQuery アグリゲーター関数のオーバーフロー条件と XML-DML 検証エラーの 2 つの例外があります。 ほとんどの動的エラーは空のシーケンスにマップされることに注意してください。 そうしないと、XML インデックスを利用するクエリ実行によって予期しないエラーが発生する可能性があります。 そのため、予期しないエラーを生成せずに効率的な実行を提供するために、データベース エンジンSQL Server動的エラーを () にマップします。
多くの場合、述語内で動的エラーが発生する状況では、() が False にマップされるため、エラーを発生させるのでセマンティクスは変更されません。 ただし、動的エラーではなく () を返すと予期しない結果が生じることがあります。 これを示す例を次に示します。
例: avg() 関数を文字列と共に使用する
次の例では、 avg 関数 を呼び出して、3 つの値の平均を計算します。 これらの値の 1 つは文字列です。 この場合の 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 関数の使用
述語で not 関数 (例: ) を使用し、 /SomeNode[not(Expression)]
式で動的エラーが発生すると、エラーではなく空のシーケンスが返されます。 空のシーケンスに 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() 関数はサポートされていません。