共用方式為


錯誤處理 (XQuery)

W3C 規格允許靜態或動態地引發類型錯誤,以及定義靜態、動態及類型錯誤。

靜態錯誤

靜態錯誤是使用 Transact-SQL 錯誤機制傳回。在 SQL Server 中,會靜態地傳回 XQuery 類型錯誤。如需詳細資訊,請參閱<XQuery 與靜態類型>。

動態錯誤

在 XQuery 中,大部份動態錯誤會對應到空白時序 ("()")。但是,有兩個例外狀況:XQuery 彙總函數中的溢位條件,以及 XML-DML 驗證錯誤。請注意,大部份動態錯誤會對應到空白時序。否則,利用 XML 索引的優點而執行的查詢可能會發生非預期的錯誤。因此,為了使執行有效率又不會產生非預期的錯誤,SQL Server 2005 Database Engine 會將動態錯誤對應到 ()。

因為 () 是對應到 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 函數以計算三個值的平均值。其中一個值是一個字串。因為此例中的 XML 執行個體不具類型,所以其內含的所有資料都屬於不具類型的不可部份完成類型。avg() 函數會先將值轉換成 xs:double 之後,再計算平均值。但是,無法將值 "Hello" 轉換成 xs:double,因而產生一個動態錯誤。在此情況下,將 "Hello" 轉換成 xs:double 會導致產生空白時序,而不是傳回動態錯誤。avg() 函數會忽略此值,而計算其餘兩值的平均值,然後傳回 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 協助