FOR XML에서 EXPLICIT 모드 사용

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

문서에 설명된 대로 FOR XML, RAW 및 AUTO 모드를 사용하여 XML을 생성해도 쿼리 결과에서 생성된 XML의 모양을 제어할 수 없습니다. 그러나 EXPLICIT 모드는 쿼리 결과에서 원하는 XML을 생성하는 데 가장 많은 유연성을 제공합니다.

XML에 예상되는 중첩과 같은 필수 XML에 대한 추가 정보는 쿼리의 일부로 명시적으로 지정하는 방식으로 EXPLICIT 모드 쿼리를 작성해야 합니다. 요청하는 XML에 따라 EXPLICIT 모드 쿼리를 작성하는 것이 번거로울 수 있습니다. 중첩과 함께 PATH 모드를 사용하는 것이 EXPLICIT 모드 쿼리를 작성하는 간단한 대안임을 알 수 있습니다.

EXPLICIT 모드에서 쿼리의 일부로 원하는 XML을 설명하므로 생성된 XML이 올바른 형식이고 유효한지 확인해야 합니다.

EXPLICIT 모드의 행 집합 처리

EXPLICIT 모드는 쿼리 실행 결과 행 집합을 XML 문서로 변환합니다. EXPLICIT 모드가 XML 문서를 생성하려면 행 집합에 특정 형식이 있어야 합니다. 이렇게 하려면 처리 논리가 원하는 XML을 생성할 수 있도록 특정 형식으로 행 집합, 범용 테이블을 생성하는 SELECT 쿼리를 작성해야 합니다.

먼저 쿼리는 다음 두 개의 메타데이터 열을 생성해야 합니다.

  • 첫 번째 열은 현재 요소의 태그 번호, 정수 형식을 제공해야 하며 열 이름은 Tag여야 합니다. 쿼리는 행 집합에서 생성될 각 요소에 대해 고유한 태그 번호를 제공해야 합니다.

  • 두 번째 열은 부모 요소의 태그 번호를 제공해야 하며 이 열 이름은 Parent여야 합니다. 이러한 방식으로 태그 및 부모 열은 계층 정보를 제공합니다.

이러한 메타데이터 열 값은 열 이름의 정보와 함께 원하는 XML을 생성하는 데 사용됩니다. 쿼리는 특정 방식으로 열 이름을 제공해야 합니다. 또한 부모 열의 0 또는 NULL은 해당 요소에 부모가 없음을 나타냅니다. 요소는 최상위 요소로 XML에 추가됩니다.

쿼리에 의해 생성된 범용 열이 XML 결과를 생성하도록 처리되는 방법을 이해하려면 이 범용 테이블을 생성하는 쿼리를 작성했다고 가정해 보십시오.

Sample universal table.

이 범용 테이블에 대해 다음 사항에 유의하세요.

  • 처음 두 열은 TagParent 이며 메타 열입니다. 이러한 값은 계층 구조를 결정합니다.

  • 열 이름은 이 문서의 뒷부분에 설명된 대로 특정 방식으로 지정됩니다.

  • 이 유니버설 테이블에서 XML을 생성할 때 이 테이블의 데이터는 세로로 열 그룹으로 분할됩니다. 그룹화는 태그 값 및 열 이름에 따라 결정됩니다. XML을 생성할 때 처리 논리는 각 행에 대해 하나의 열 그룹을 선택하고 요소를 생성합니다. 이 예제에서는 다음이 적용됩니다.

    • 첫 번째 행의 태그 열 값 1의 경우 이름에 동일한 태그 번호인 Customer!1!cidCustomer!1!name이 포함된 열이 그룹을 형성합니다. 이러한 열은 행을 처리하는 데 사용되며 생성된 요소 <Customer id=... name=...>의 모양이 있음을 알 수 있습니다. 열 이름 형식은 이 문서의 뒷부분에 설명되어 있습니다.

    • 태그 열 값이 2인 행의 경우 열 Order!2!idOrder!2!date는 요소를 <Order id=... date=... />생성하는 데 사용되는 그룹을 형성합니다.

    • Tag 열 값이 3인 행에 대해 OrderDetail!3!id!idOrderDetail!3!pid!idref 열은 그룹을 형성합니다. 이러한 각 행은 이러한 열에서 요소를 <OrderDetail id=... pid=...>생성합니다.

  • XML 계층을 생성할 때 행은 순서대로 처리됩니다. XML 계층 구조는 다음과 같이 결정됩니다.

    • 첫 번째 행은 Tag 값 1과 Parent 값 NULL을 지정합니다. 따라서 해당 요소인 <Customer> 요소가 XML의 최상위 요소로 추가됩니다.

      <Customer cid="C1" name="Janine">
      
    • 두 번째 행은 태그 값 2와 부모 값 1을 식별합니다. 따라서 요소 요소 <Order> 는 요소의 <Customer> 자식으로 추가됩니다.

      <Customer cid="C1" name="Janine">
         <Order id="O1" date="1/20/1996">
      
    • 다음 두 행은 태그 값 3과 부모 값 2를 식별합니다. 따라서 요소 두 요소가 <OrderDetail> 요소의 <Order> 자식으로 추가됩니다.

      <Customer cid="C1" name="Janine">
         <Order id="O1" date="1/20/1996">
            <OrderDetail id="OD1" pid="P1"/>
            <OrderDetail id="OD2" pid="P2"/>
      
    • 마지막 행은 2를 태그 번호로, 1을 부모 태그 번호로 식별합니다. 따라서 다른 <Order> 요소 자식이 부모 요소에 <Customer> 추가됩니다.

      <Customer cid="C1" name="Janine">
         <Order id="O1" date="1/20/1996">
            <OrderDetail id="OD1" pid="P1"/>
            <OrderDetail id="OD2" pid="P2"/>
         </Order>
         <Order id="O2" date="3/29/1997">
      </Customer>
      

요약하면 태그부모 메타 열의 값, 열 이름에 제공된 정보 및 행의 올바른 순서는 EXPLICIT 모드를 사용할 때 원하는 XML을 생성합니다.

범용 테이블 행 순서 지정

XML을 생성할 때 범용 테이블의 행은 순서대로 처리됩니다. 따라서 부모 노드와 연결된 올바른 자식 인스턴스를 검색하려면 각 부모 노드 바로 뒤에 자식이 오도록 행 집합의 행을 정렬해야 합니다.

범용 테이블에서 열 이름 지정

EXPLICIT 모드 쿼리를 작성할 때는 이 형식을 사용하여 결과 행 집합의 열 이름을 지정해야 합니다. 지시문을 사용하여 지정된 요소 및 특성 이름 및 기타 추가 정보를 포함한 변환 정보를 제공합니다.

일반적인 형식은 다음과 같습니다.

ElementName!TagNumber!AttributeName!Directive

다음은 형식의 각 부분에 대한 설명입니다.

  • ElementName

    요소의 결과 제네릭 식별자입니다. 예를 들어 Customers가 ElementName<Customers>으로 지정되면 요소가 생성됩니다.

  • TagNumber

    요소에 할당된 고유 태그 값입니다. 이 값은 두 메타데이터 열인 TagParent의 도움으로 결과 XML의 요소 중첩을 결정합니다.

  • AttributeName

    지정된 ElementName을 생성하기 위해 특성 이름을 제공합니다. 지시문이 지정되지 않은 경우 동작입니다.

    Directive 가 지정되어 있고 xml, cdata또는 element인 경우 이 값은 ElementName의 요소 자식을 생성하는 데 사용되고 열 값이 여기에 추가됩니다.

    지시문을 지정하면 AttributeName비어 있을 수 있습니다. 예를 들어 ElementName! TagNumber!! 지시문. 이 경우 열 값은 ElementName에 직접 포함됩니다.

  • 지시문

    지시문 은 선택 사항이며 XML 생성에 대한 추가 정보를 제공하는 데 사용할 수 있습니다. 지시문 에는 두 가지 용도가 있습니다.

    • 한 가지 목적은 값을 ID, IDREF 및 IDREFS로 인코딩하는 것입니다. ID, IDREF 및 IDREFS 키워드를 지시문으로 지정할 수 있습니다. 이러한 지시어는 특성 유형을 덮어씁니다. 이렇게 하면 문서 내 링크를 만들 수 있습니다.

    • 또한 지시문을 사용하여 문자열 데이터를 XML에 매핑하는 방법을 나타낼 수 있습니다. hide, element, elementxsinil, xml, xmltextcdata 키워드는 Directive로 사용될 수 있습니다. hide 지시어는 노드를 숨깁니다. 정렬 용도로만 값을 검색하지만 결과 XML에서 값을 검색하지 않으려는 경우에 유용합니다.

    element 지시어는 특성 대신 포함된 요소를 생성합니다. 포함된 데이터는 엔터티로 인코딩됩니다. 예를 들어 < 문자는 <가 됩니다. NULL 열 값의 경우 요소가 생성되지 않습니다. null 열 값에 대해 요소를 생성하려면 elementxsinil 지시문을 지정할 수 있습니다. 그러면 xsi:nil=TRUE 특성이 있는 요소가 생성됩니다.

    xml 지시어는 element 지시어와 비슷하지만 엔터티 인코딩이 발생하지 않는다는 점이 다릅니다. 요소 지시문은 ID, IDREF 또는 IDREFS결합할 수 있지만 xml 지시문은 숨기기를 제외한 다른 지시문과 함께 허용되지 않습니다.

    cdata 지시어는 CDATA 섹션으로 데이터를 묶어서 포함시킵니다. 콘텐츠는 엔터티로 인코딩되지 않습니다. 원래 데이터 형식은 varchar, nvarchar, text또는 ntext와 같은 텍스트 유형이어야 합니다. 이 지시어와 함께 사용할 수 있는 것은 hide뿐입니다. 이 지시어를 사용할 때는 AttributeName 을 지정하지 말아야 합니다.

    대부분의 경우 이러한 두 그룹 간에 지시문을 결합할 수 있지만 둘 다 결합하는 것은 허용되지 않습니다.

지시문AttributeName이 지정되지 않은 경우(예: Customer!1) 요소 지시문이 암시됩니다(예: Customer!1!!). 요소 및 열 데이터가 ElementName포함됩니다.

xmltext 지시문을 지정하면 열 내용이 문서의 나머지 부분과 통합된 단일 태그로 래핑됩니다. 이 지시어는 OPENXML에 의해 열에 저장된 사용되지 않은 오버플로 XML 데이터를 인출하는 데 유용합니다. 자세한 내용은 OPENXML(SQL Server)을 참조 하세요.

AttributeName을 지정하면 태그 이름이 지정된 이름으로 대체됩니다. 그렇지 않으면 엔터티 인코딩 없이 콘텐츠를 포함 시작 부분에 배치하여 바깥쪽 요소의 현재 특성 목록에 특성이 추가됩니다. 이 지시문이 있는 열은 varchar, nvarchar, char, nchar, text 또는 ntext와 같은 텍스트 형식이어야 합니다. 이 지시어와 함께 사용할 수 있는 것은 hide뿐입니다. 이 지시문은 열에 저장된 오버플로 데이터를 가져오는 데 유용합니다. 콘텐츠가 올바른 형식의 XML이 아니면 동작이 정의되지 않습니다.

다음 단계

다음 예제에서는 EXPLICIT 모드를 사용하는 방법을 보여 줍니다.

참고 항목