XML 데이터 직렬화 정의
적용 대상: SQL Server Azure SQL Database Azure SQL Managed Instance
xml 데이터 형식을 명시적 또는 암시적으로 SQL 문자열 또는 이진 형식으로 캐스팅할 때 xml 데이터 형식의 콘텐츠는 이 항목에 제시된 규칙에 따라 직렬화됩니다.
직렬화 인코딩
SQL 대상 유형이 VARBINARY인 경우 결과는 UTF-16 바이트 순서 표시가 앞에 표시되어 있지만 XML 선언이 없는 UTF-16으로 직렬화됩니다. 대상 유형이 너무 작을 경우 오류가 발생합니다.
예시:
select CAST(CAST(N'<Δ/>' as XML) as VARBINARY(MAX))
다음은 결과입니다.
0xFFFE3C0094032F003E00
SQL 대상 유형이 NVARCHAR 또는 NCHAR인 경우 결과는 전면 바이트 순서 표시와 XML 선언 없이 UTF-16으로 직렬화됩니다. 대상 유형이 너무 작을 경우 오류가 발생합니다.
예시:
select CAST(CAST(N'<Δ/>' as XML) as NVARCHAR(MAX))
다음은 결과입니다.
<Δ/>
SQL 대상 유형이 VARCHAR 또는 CHAR인 경우 결과는 바이트 순서 표시 또는 XML 선언 없이 데이터베이스의 데이터 정렬 코드 페이지에 상응하는 인코딩으로 직렬화됩니다. 대상 형식이 너무 작거나 값을 대상 데이터 정렬 코드 페이지에 매핑할 수 없는 경우 오류가 발생합니다.
예시:
select CAST(CAST(N'<Δ/>' as XML) as VARCHAR(MAX))
현재의 데이터 정렬 코드 페이지가 유니코드 문자 Δ를 표시할 수 없거나 특정 인코딩에서 이를 표시할 경우 오류가 발생할 수 있습니다.
XML 결과를 클라이언트 쪽으로 반환할 때 데이터는 UTF-16 인코딩으로 전송됩니다. 그런 다음 클라이언트 쪽 공급자는 해당 API 규칙에 따라 이 데이터를 제공합니다.
XML 구조의 직렬화
xml 데이터 형식의 콘텐츠는 일반적인 방식으로 직렬화됩니다. 특히, 요소 노드는 요소 표시에, 텍스트 노드는 텍스트 콘텐츠에 매핑됩니다. 그러나 문자가 엔터티화되는 상황과 형식화된 원자성 값을 직렬화하는 방법은 다음 섹션에서 설명합니다.
직렬화 중에 XML 문자 엔터티화하기
직렬화된 모든 XML 구조는 다시 구문 분석을 할 수 있어야 합니다. 따라서 일부 문자는 XML 파서의 정규화 단계를 통해 문자의 왕복 기능을 보존할 수 있도록 엔터티화된 방식으로 직렬화되어야 합니다. 그러나 문서를 잘 구성하고 구문 분석을 할 수 있도록 일부 문자는 엔터티화되어야 합니다. 직렬화 중에 적용되는 엔터티화 규칙은 다음과 같습니다.
문자 &, <, >가 특성 값이나 요소 콘텐츠 내에 있는 경우 해당 문자는 언제나 각각
&
,<
,>
로 엔터티화됩니다.SQL Server는 특성 값을 묶을 때 따옴표(U+0022)를 사용하기 때문에 특성 값에 있는 따옴표는
"
로 엔터티화됩니다.서로게이트 쌍은 서버에서만 캐스팅할 때 단일 숫자 문자 참조로 엔터티화됩니다. 예를 들어, 서로게이트 쌍 U+D800 U+DF00은 숫자 문자 참조
𐌀
로 엔터티화됩니다.TAB(U+0009) 및 라인피드(LF, U+000A)는 구문 분석 중에 정규화되지 않도록 특성 값 내에서 각각 숫자 문자 참조
	
과

로 엔터티화됩니다.캐리지 리턴(CR, U+000D)은 구문 분석 중에 정규화되지 않도록 특성 값과 요소 콘텐츠 내에서 숫자 문자 참조

로 엔터티화됩니다.공백만 포함된 텍스트 노드를 보호하기 위해 공백 문자 중 하나(일반적으로 마지막 공백 문자)는 해당 숫자 문자 참조로 엔터티화됩니다. 이러한 식으로 재분석은 구문 분석 중 공백 처리 설정과 무관하게 공백 텍스트 노드를 보존합니다.
예시:
DECLARE @u NVARCHAR(50)
set @u = N'<a a="
'+NCHAR(0xD800)+NCHAR(0xDF00)+N'>"> '+NCHAR(0xA)+N'</a>'
SELECT CAST(CONVERT(XML,@u,1) as NVARCHAR(50));
다음은 결과입니다.
<a a="
𐌀>">
</a>
이전의 공백 보호 규칙을 적용하지 않으려면 xml에서 문자열 또는 이진 형식으로 캐스팅할 때 명시적 CONVERT 옵션 1을 사용할 수 있습니다. 예를 들어, 엔터티화를 방지하기 위해 다음을 수행할 수 있습니다.
SELECT CONVERT(NVARCHAR(50), CONVERT(XML, '<a> </a>', 1), 1);
query() 메서드(xml 데이터 형식)는 xml 데이터 형식 인스턴스를 생성합니다. 따라서 문자열 또는 이진 형식으로 캐스팅되는 query()
메서드의 결과는 앞서 설명한 규칙에 따라 엔터티화됩니다. 엔터티화되지 않은 문자열 값을 얻으려면 대신 value() 메서드(xml 데이터 형식)를 사용해야 합니다. 다음은 query()
메서드의 사용 예시입니다.
DECLARE @x xml
SET @x = N'<a>This example contains an entitized char: .</a>'
SELECT @x.query('/a/text()');
다음은 결과입니다.
This example contains an entitized char: .
다음은 value()
메서드의 사용 예시입니다.
SELECT @x.value('(/a/text())[1]', 'nvarchar(100)');
다음은 결과입니다.
This example contains an entitized char: .
형식화된 xml 데이터 형식 직렬화하기
형식화된 xml 데이터 형식 항목에는 해당 XML 스키마 유형에 따라 형식화된 값이 포함됩니다. 이러한 값은 xs:string으로 캐스팅된 XQuery가 산출하는 것과 동일한 형식의 XML 스키마 형식에 따라 직렬화됩니다. 더 자세한 내용은 XQuery의 형식 캐스팅 규칙 참조.
예를 들어, 다음 예제에서 보는 바와 같이 xs:double 값 1.34e1은 13.4로 직렬화됩니다.
declare @x xml
set @x =''
select CAST(@x.query('1.34e1') as nvarchar(50));
이것은 문자열 값 13.4를 반환합니다.