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