잘못된 문자 및 이스케이프 규칙

적용 대상:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

이 문서에서는 FOR XML 절에서 잘못된 XML 문자를 처리하는 방법을 설명하고 XML 이름에 잘못된 문자에 대한 이스케이프 규칙을 나열합니다.

FOR XML 및 잘못된 문자

SQL Server는 TYPE 지시문을 사용하지 않는 FOR XML 쿼리 내에서 반환되는 경우 잘못된 XML 문자를 엔터티화합니다.

XML 1.0 호환 파서는 이러한 문자가 엔터티화되었는지 여부에 관계없이 구문 분석 오류를 발생시키지만 엔터티화된 양식은 XML 1.1과 더 잘 정렬됩니다. 또한 엔터티화된 양식은 이후 버전의 XML 표준과 더 잘 정렬될 수 있습니다. 또한 잘못된 문자의 코드 포인트가 표시되기 때문에 디버깅이 더 간단해집니다.

XML 도구 사용자의 경우 XML 파서가 데이터 스트림에서 잘못된 문자가 발생하는 지점에서 어느 쪽이든 실패하기 때문에 해결 방법이 필요하지 않습니다. 비 XML 도구를 사용하는 경우 이러한 문자를 엔터티화된 값으로 검색하도록 프로그래밍 논리를 업데이트해야 할 수 있습니다.

다음 공백 문자는 FOR XML 쿼리에서 다르게 엔터티화되어 라운드트립을 통해 현재 상태를 유지합니다.

  • 요소 콘텐츠 및 특성에서: hex(0D) (캐리지 리턴)

  • 특성 콘텐츠: hex(09) (탭), hex(0A) (줄 바꿈)

이러한 문자는 출력에서 유지되며 파서는 정규화되지 않습니다.

이스케이프 규칙

공백과 같은 XML 이름에 잘못된 문자가 포함된 SQL Server 이름은 잘못된 문자가 이스케이프된 숫자 엔터티 인코딩으로 변환되는 방식으로 XML 이름으로 변환됩니다.

XML 이름 내에는 콜론() 및 밑_줄(:)의 두 개의 사전순 문자만 있을 수 있습니다. 콜론이 이미 네임스페이스에 대해 예약되어 있으므로 밑줄이 이스케이프 문자로 선택됩니다. 다음은 인코딩에 사용되는 이스케이프 규칙입니다.

  • XML 1.0 사양에 따라 유효한 XML 이름 문자가 아닌 UCS-2 문자는 다음과 같이 _xHHHH_이스케이프됩니다. 가장 HHHH 중요한 비트 우선 순서의 문자에 대한 4자리 16진수 UCS-2 코드를 나타냅니다. 예를 들어 테이블 이름은 Order Details .로 Order_x0020_Details인코딩됩니다.

  • UCS-2 영역에 맞지 않는 문자(U+00010000~U+0010FFFF 범위의 UCS-4 추가)는 로 _xHHHHHHHH_인코딩됩니다. SQL HHHHHHHH Server 2000 이전 버전과의 호환 모드에서 문자의 8자리 16진수 UCS-4 인코딩을 나타냅니다. 그렇지 않으면 문자는 ISO 표준에 맞게 인코딩 _xHHHHHH_됩니다.

  • 뒤에 문자가 없으면 밑줄 문자를 x이스케이프할 필요가 없습니다. 예를 들어 테이블 이름은 Order_Details 인코딩되지 않습니다.

  • 식별자의 콜론은 이스케이프되지 않습니다. 따라서 FOR XML 쿼리를 통해 네임스페이스 요소와 특성 이름을 생성할 수 있습니다. 예를 들어 다음 쿼리는 이름에 콜론이 있는 네임스페이스 특성을 생성합니다.

    SELECT 'namespace-urn' as 'xmlns:namespace',
     1 as 'namespace:a'
    FOR XML RAW;
    

    쿼리 결과는 다음과 같습니다.

    <row xmlns:namespace="namespace-urn" namespace:a="1"/>
    

    WITH XMLNAMESPACES는 XML 네임스페이스를 추가하는 데 권장되는 방법입니다.

참고 항목