錯誤處理 (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 驗證錯誤。 請注意,大部分的動態錯誤都會對應至空序列。 否則,利用 XML 索引優勢的查詢執行可能會引發非預期的錯誤。 因此,為了提供有效率的執行,而不會產生非預期的錯誤,SQL Server Database Engine 會將動態錯誤對應至 ()。

經常,在述詞內發生動態錯誤的情況下,不會引發錯誤並不會變更語意,因為 () 會對應至 False。 不過,在某些情況下,傳回 () 而不是動態錯誤可能會導致非預期的結果。 以下是說明這一點的範例。

範例:搭配字串使用 avg() 函式

在下列範例中 ,會呼叫 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(//*)')  

範例:使用 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 基本概念