次の方法で共有


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

参照

概念

XQuery の基礎

その他の技術情報

xml データ型に対する XQuery

ヘルプおよび情報

SQL Server 2005 の参考資料の入手