次の方法で共有


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

参照

XQuery 言語リファレンス (SQL Server)
XQuery の基礎