오류 처리(XQuery)
W3C 사양에서는 형식 지정 오류를 정적 또는 동적으로 발생시키고 정적, 동적 및 형식 지정 오류를 정의합니다.
정적 오류
정적 오류는 Transact-SQL 오류 메커니즘을 사용하여 반환됩니다. SQL Server 에서 XQuery 형식 지정 오류는 정적으로 반환됩니다. 자세한 내용은 XQuery 및 정적 형식 지정을 참조하십시오.
동적 오류
XQuery에서 대부분의 동적 오류는 빈 시퀀스("()")로 매핑됩니다. 하지만 여기에는 XQuery 집계 함수의 오버플로 조건과 XML-DML 유효성 검사 오류의 두 가지 예외가 있습니다. 대부분의 동적 오류는 빈 시퀀스로 매핑됩니다. 그렇지 않으면 XML 인덱스를 활용하는 쿼리 실행 시 오류가 발생할 수 있습니다. 따라서 오류를 발생시키지 않고 효율적으로 쿼리를 실행하기 위해 SQL Server 2005 데이터베이스 엔진 는 동적 오류를 ()로 매핑합니다.
동적 오류가 조건자 내에서 발생하는 경우에는 오류가 발생하지 않아도 ()가 False로 매핑되기 때문에 의미가 변경되지 않는 경우가 많습니다. 하지만 일부 경우 동적 오류 대신 ()를 반환하면 예기치 않은 결과가 발생할 수 있습니다. 다음은 이를 보여 주는 예입니다.
예 1
다음 쿼리를 살펴보십시오.
DECLARE @x xml
SET @x='<a>Hello</a>'
SELECT @x.query('xs:double(/a[1])')
xs:double(/a[1]
) 식은 동적 오류를 일으킵니다. 런타임에 string() 함수에 의해 반환된 문자열을 double로 변환하면 동적 오류가 발생합니다. 오류를 반환하는 대신 쿼리는 빈 시퀀스를 반환합니다.
예 2
다음 예에서는 avg 함수를 호출하여 3개 값의 평균을 계산합니다. 이들 값 중 하나는 문자열입니다. 이 경우 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(//*)')
예 3
/SomeNode[not(Expression)]
과 같이 조건자에서 not 함수를 사용하여 식이 동적 오류를 발생시킬 때는 오류 대신 빈 시퀀스가 반환됩니다. 빈 시퀀스에 **not()**을 적용하면 오류 대신 True가 반환됩니다.
예 4
다음 예에서 리터럴 문자열 "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() 함수는 지원되지 않습니다.