다음을 통해 공유


오류 처리(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() 함수 사용

다음 예제 에서는 평균 함수 를 호출하여 세 값의 평균을 계산합니다. 이러한 값 중 하나는 문자열입니다. 이 경우 XML 인스턴스는 형식화되지 않으므로 XML 인스턴스의 모든 데이터는 형식화되지 않은 원자성 형식입니다. avg() 함수는 평균을 계산하기 전에 먼저 이러한 값을 xs:double로 캐스팅합니다. 그러나 값"Hello"은 xs:double캐스팅할 수 없으며 동적 오류를 만듭니다. 이 경우 동적 오류를 반환하는 대신 xs:double로 캐스팅 "Hello" 하면 빈 시퀀스가 발생합니다. 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() 함수는 지원되지 않습니다.

참고 항목

XQuery 언어 참조(SQL Server)
XQuery 기본 사항