錯誤處理 (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 資料庫引擎 將動態錯誤對應至 ()。
經常,在述詞內發生動態錯誤的情況下,不會引發錯誤並不會變更語意,因為 () 會對應至 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() 函式。