xml 데이터 형식 메서드를 사용하기 위한 지침
다음 목록에는 xml 데이터 형식 메서드를 사용하기 위한 지침이 포함됩니다.
xml 데이터 형식 메서드는 다음 예에 표시된 것과 같이 PRINT 문에서 사용할 수 없습니다. xml 데이터 형식 메서드는 하위 쿼리로 취급되며 하위 쿼리는 PRINT 문에 허용되지 않습니다. 따라서 다음 예는 오류를 반환합니다.
DECLARE @x xml SET @x = '<root>Hello</root>' PRINT @x.value('/root[1]', 'varchar(20)') -- will not work because this is treated as a subquery (select top 1 col from table)
이에 대한 해결 방법은 먼저 value() 메서드의 결과를 xml 형식의 변수에 할당한 다음 쿼리에서 변수를 지정하는 것입니다.
DECLARE @x xml DECLARE @c varchar(max) SET @x = '<root>Hello</root>' SET @c = @x.value('/root[1]', 'varchar(11)') PRINT @c
xml 데이터 형식 메서드는 내부적으로 하위 쿼리로 취급됩니다. GROUP BY에는 스칼라가 필요하고 집계 및 하위 쿼리가 허용되지 않기 때문에 GROUP BY 절에 xml 데이터 형식 메서드를 지정할 수 없습니다. 이에 대한 해결 방법은 절 내에서 XML 메서드를 사용하는 사용자 정의 함수를 호출하는 것입니다.
오류를 보고할 때 xml 데이터 형식 메서드는 다음 형식의 단일 오류를 발생시킵니다.
Msg errorNumber, Level levelNumber, State stateNumber: XQuery [database.table.method]: description_of_error
예를 들면 다음과 같습니다.
Msg 2396, Level 16, State 1: XQuery [xmldb_test.xmlcol.query()]: Attribute may not appear outside of an element
exist() 메서드는 비어 있지 않은 결과를 반환하는 XQuery 식에 대해 1을 반환합니다. exist() 메서드 내에서 true() 또는 false() 함수를 지정하면 true() 및 false() 함수가 각각 부울 값인 True와 False를 반환하기 때문에 exist() 메서드가 1을 반환합니다. 즉, 이들 함수는 비어 있지 않은 결과를 반환합니다. 따라서 **exist()**는 다음 예에서와 같이 1(True)을 반환합니다.
declare @x xml set @x='' select @x.exist('true()')