錯誤處理 (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() 函式。