適用於:SQL Server
W3C 規格允許以靜態或動態方式引發類型錯誤,並定義靜態、動態和類型錯誤。
編譯和錯誤處理
編譯錯誤是從語法不正確的 Xquery 表示式和 XML DML 陳述式傳回的。 編譯階段會檢查 XQuery 運算式和 DML 語句的靜態類型正確性,並使用 XML 架構進行具類型的 XML 推斷。 如果表達式在運行時間可能會因為類型安全違規而失敗,就會引發靜態類型錯誤。 靜態錯誤的範例是將字串加入至整數,並查詢類型數據不存在的節點。
由於與 W3C 標準偏差,XQuery 執行時間錯誤會轉換成空序列。 這些序列可能會傳播為空 XML 或 NULL 傳送至查詢結果,視呼叫環境定義而定。
明確轉換成正確的類型可讓使用者解決靜態錯誤,不過運行時間轉換錯誤會轉換成空序列。
備註
剖析 XQuery 剖析器所引發的錯誤 (例如,作為 XML 資料類型方法一部分所參照的 XML 中的語法錯誤) 會中止作用中交易,而不論現行階段作業的 XACT_ABORT 設定為何。
靜態錯誤
靜態錯誤是使用 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() 函式。