FOR XML에서 EXPLICIT 모드 사용Use EXPLICIT Mode with FOR XML

이 항목은 다음에 적용됩니다.예SQL Server(2008부터)아니요Azure SQL Database아니요Azure SQL Data Warehouse 아니요병렬 데이터 웨어하우스 THIS TOPIC APPLIES TO:yesSQL Server (starting with 2008)noAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse FOR XML을 사용하는 XML 생성 항목에 설명된 것과 같이 RAW 및 AUTO 모드에서는 쿼리 결과로 생성되는 XML의 모양을 상세하게 조정할 수 없습니다. As described in the topic, Constructing XML Using FOR XML, RAW and AUTO mode do not provide much control over the shape of the XML generated from a query result. 하지만 EXPLICIT 모드에서는 쿼리 결과로 생성되는 XML의 모양을 좀 더 상세하게 조정할 수 있습니다.However, EXPLICIT mode provides the most flexibility in generating the XML you want from a query result.

XML에 예상되는 중첩과 같은 필수 XML에 대한 추가 정보는 쿼리의 일부로 명시적으로 지정하는 방식으로 EXPLICIT 모드 쿼리를 작성해야 합니다.The EXPLICIT mode query must be written in a specific way so that the additional information about the required XML, such as expected nesting in the XML, is explicitly specified as part of the query. 요청한 XML에 따라 EXPLICIT 모드 쿼리를 작성하는 작업은 복잡할 수 있습니다.Depending on the XML you request, writing EXPLICIT mode queries can be cumbersome. EXPLICIT 모드 쿼리를 작성하는 것보다는 PATH 모드 사용 의 설명에 따라 중첩을 사용하는 것이 더 간단합니다.You may find that Using PATH Mode with nesting is a simpler alternative to writing EXPLICIT mode queries.

EXPLICIT 모드에서 쿼리의 일부로 원하는 XML을 기술하기 때문에 생성된 XML은 형식이 올바르고 유효해야 합니다.Because you describe the XML you want as part of the query in EXPLICIT mode, you must ensure that the generated XML is well formed and valid.

EXPLICIT 모드의 행 집합 처리Rowset Processing in EXPLICIT Mode

EXPLICIT 모드는 쿼리 실행으로부터 만들어지는 행 집합을 XML 문서로 변환합니다.The EXPLICIT mode transforms the rowset that results from the query execution into an XML document. EXPLICIT 모드의 경우 XML문서를 만들기 위해서는 행 집합이 특정 형식을 가져야 합니다.In order for EXPLICIT mode to produce the XML document, the rowset must have a specific format. 이를 위해서는 처리 논리에서 원하는 XML을 생성할 수 있도록 특정 형식을 지닌 행 집합인 범용 테이블을 생성하는 SELECT 쿼리를 작성해야 합니다.This requires that you write the SELECT query to produce the rowset, the universal table, with a specific format so the processing logic can then produce the XML you want.

먼저 쿼리는 다음 두 메타데이터 열을 생성해야 합니다.First, the query must produce the following two metadata columns:

  • 첫 번째 열은 현재 요소에 대한 정수 형식의 태그 번호를 제공해야 하며 열 이름은 Tag여야 합니다.The first column must provide the tag number, integer type, of the current element, and the column name must be Tag. 쿼리에서는 행 집합으로부터 생성될 각 요소의 고유 태그 번호를 제공해야 합니다.Your query must provide a unique tag number for each element that will be constructed from the rowset.

  • 두 번째 열은 부모 요소의 태그 번호를 제공해야 하며 이 열 이름은 Parent여야 합니다.The second column must provide a tag number of the parent element, and this column name must be Parent. 이러한 빙식으로 Tag 및 Parent 열은 계층 정보를 제공합니다.In this way, the Tag and the Parent column provide hierarchy information.

    이러한 메타데이터 열 값은 열 이름의 정보와 함께 원하는 XML을 생성하는 데 사용됩니다.These metadata column values, together with the information in the column names, are used to produce the XML you want. 쿼리에서는 특정 방식으로 열 이름을 제공해야 합니다.Note that your query must provide column names in a specific way. 또한 Parent 열에 있는 0 또는 NULL은 해당 요소에 부모가 없음을 나타냅니다.Also note that a 0 or NULL in the Parent column indicates that the corresponding element has no parent. 요소는 최상위 요소로 XML에 추가됩니다.The element is added to the XML as a top-level element.

    쿼리에 의해 생성된 범용 열이 XML 결과를 생성하도록 처리되는 방법을 이해하려면 이 범용 테이블을 생성하는 쿼리를 작성했다고 가정해 보십시오.To understand how the universal table generated by a query is processed into generating XML result, assume that you have written a query that produces this universal table:

    예제 범용 테이블Sample universal table

    이 범용 테이블에 대해 다음 사항을 유의하십시오.Note the following about this universal table:

  • 처음 두 열은 TagParent 이며 메타 열입니다.The first two columns are Tag and Parent and are meta columns. 이러한 값은 계층을 결정합니다.These values determine the hierarchy.

  • 열 이름은 이 항목의 후반에 설명된 바와 같은 특정 방식으로 지정됩니다.The column names are specified in a certain way, as described later in this topic.

  • 이 범용 테이블로부터 XML을 생성할 때 이 테이블의 데이터는 열 그룹으로 수직 분할됩니다.In generating the XML from this universal table, the data in this table is partitioned vertically into column groups. 그룹화는 Tag 값 및 열 이름에 따라 결정됩니다.The grouping is determined based on the Tag value and the column names. XML을 생성할 때 처리 논리는 각 행에 대해 하나의 열 그룹을 선택하고 요소를 생성합니다.In constructing XML, the processing logic selects one group of columns for each row and constructs an element. 이 예에서는 다음 사항이 적용됩니다.The following applies in this example:

    • 첫 번째 행에 있는 Tag 열 값 1에 대해 이름에 동일한 태그 번호 Customer!1!cidCustomer!1!name이 포함된 열은 하나의 그룹을 형성합니다.For Tag column value 1 in the first row, the columns whose names include the same tag number, Customer!1!cid and Customer!1!name, form a group. 이러한 열은 행을 처리하는 데 사용되며 생성된 요소의 모양은 <Customer id=... name=...>임을 알 수 있습니다.These columns are used in processing the row, and you may have noticed that the shape of the generated element is <Customer id=... name=...>. 열 이름 형식은 이 항목의 후반에 설명됩니다.Column name format is described later in this topic.

    • Tag 열 값이 2인 행에 대해 Order!2!idOrder!2!date 열은 이후에 <Order id=... date=... /> 요소를 생성하는 데 사용되는 그룹을 형성합니다.For rows with Tag column value 2, columns Order!2!id and Order!2!date form a group that is then used in constructing elements, <Order id=... date=... />.

    • Tag 열 값이 3인 행에 대해 OrderDetail!3!id!idOrderDetail!3!pid!idref 열은 그룹을 형성합니다.For rows with Tag column value 3, columns OrderDetail!3!id!id and OrderDetail!3!pid!idref form a group. 이러한 각 행은 이러한 열로부터 <OrderDetail id=... pid=...> 요소를 생성합니다.Each of these rows generates an element, <OrderDetail id=... pid=...>, from these columns.

  • XML 계층을 생성할 때 행은 순서대로 처리됩니다.Note that in generating XML hierarchy, the rows are processed in order. XML 계층은 다음과 같이 결정됩니다.The XML hierarchy is determined as shown in the following:

    • 첫 번째 행은 Tag 값 1과 Parent 값 NULL을 지정합니다.The first row specifies Tag value 1 and Parent value NULL. 따라서 해당 요소인 <Customer> 요소는 XML에서 최상위 요소로 추가됩니다.Therefore, the corresponding element, <Customer> element, is added as a top-level element in the XML.

      <Customer cid="C1" name="Janine">  
      
    • 두 번째 행은 Tag 값 2와 Parent 값 1을 식별합니다.The second row identifies Tag value 2 and Parent value 1. 따라서 <Order> 요소는 <Customer> 요소의 자식으로 추가됩니다.Therefore, the element, <Order> element, is added as a child of the <Customer> element.

      <Customer cid="C1" name="Janine">  
         <Order id="O1" date="1/20/1996">  
      
    • 다음 두 행은 Tag 값 3과 Parent 값 2를 식별합니다.The next two rows identify Tag value 3 and Parent value 2. 따라서 두 <OrderDetail> 요소는 <Order> 요소의 자식으로 추가됩니다.Therefore, the two elements, <OrderDetail> elements, are added as children of the <Order> element.

      <Customer cid="C1" name="Janine">  
         <Order id="O1" date="1/20/1996">  
            <OrderDetail id="OD1" pid="P1"/>  
            <OrderDetail id="OD2" pid="P2"/>  
      
    • 마지막 행은 Tag 번호로 2를 식별하고 Parent 태그 번호로 1을 식별합니다.The last row identifies 2 as the Tag number and 1 as the Parent tag number. 따라서 다른 <Order> 요소 자식이 <Customer> 부모 요소에 추가됩니다.Therefore, another <Order> element child is added to the <Customer> parent element.

      <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 모드에서는 TagParent 메타 열의 값과 열 이름에 제공된 정보 및 행의 올바른 순서로 원하는 XML이 생성됩니다.To summarize, the values in the Tag and Parent meta columns, the information provided in the column names, and the correct ordering of the rows produce the XML you want when you use EXPLICIT mode.

범용 테이블 행 순서 지정Universal Table Row Ordering

XML을 생성할 때 범용 테이블의 행은 순서대로 처리됩니다.In constructing the XML, the rows in the universal table are processed in order. 따라서 해당 부모와 연결된 올바른 자식 요소를 검색하려면 각 부모 노드 바로 다음에 해당 자식 노드가 오도록 행 집합의 행 순서를 지정해야 합니다.Therefore, to retrieve the correct children instances associated with their parent, the rows in the rowset must be ordered so that each parent node is immediately followed by its children.

범용 테이블에 열 이름 지정Specifying Column Names in a Universal Table

EXPLICIT 모드 쿼리를 작성할 때 결과 행 집합에 있는 열 이름은 다음 형식에 따라 지정되어야 합니다.When writing EXPLICIT mode queries, column names in the resulting rowset must be specified by using this format. 이러한 형식은 지시어를 사용하여 지정된 요소 및 특성 이름과 기타 추가 정보를 포함하는 변환 정보를 제공합니다.They provide transformation information including element and attribute names and other additional information, specified by using directives.

일반 형식은 다음과 같습니다.This is the general format:


ElementName!TagNumber!AttributeName!Directive  

다음은 형식의 각 부분에 대한 설명입니다.Following is the description of the parts of the format.

ElementNameElementName
요소의 일반적인 결과 식별자입니다.Is the resulting generic identifier of the element. 예를 들어 CustomersElementName으로 지정된 경우 <Customers> 요소가 생성됩니다.For example, if Customers is specified as ElementName, the <Customers> element is generated.

TagNumberTagNumber
요소에 할당된 고유 태그 값입니다.Is a unique tag value assigned to an element. 이 값은 두 메타데이터 열인 TagParent를 통해 결과 XML에서의 요소 중첩을 결정합니다.This value, with the help of the two metadata columns, Tag and Parent, determines the nesting of the elements in the resulting XML.

AttributeNameAttributeName
지정된 ElementName을 생성하기 위해 특성 이름을 제공합니다.Provides the name of the attribute to construct in the specified ElementName. 이 동작은 Directive 가 지정되지 않은 경우의 동작입니다.This is the behavior if Directive is not specified.

Directive 가 지정되어 있고 xml, cdata또는 element인 경우 이 값은 ElementName의 요소 자식을 생성하는 데 사용되고 열 값이 여기에 추가됩니다.If Directive is specified and it is xml, cdata, or element, this value is used to construct an element child of ElementName, and the column value is added to it.

Directive를 지정하면 AttributeName 을 비워 둘 수 있습니다.If you specify the Directive, the AttributeName can be empty. 예를 들면 ElementName!TagNumber!!Directive와 같습니다.For example, ElementName!TagNumber!!Directive. 이 경우 열 값은 ElementName에 직접 포함됩니다.In this case, the column value is directly contained by the ElementName.

DirectiveDirective
Directive 는 선택 항목으로서 XML 생성을 위한 추가 정보를 제공하는 데 사용할 수 있습니다.Directive is optional and you can use it to provide additional information for construction of the XML. Directive 에는 두 가지 용도가 있습니다.Directive has two purposes.

하나는 값을 ID, IDREF 및 IDREFS로 인코딩하는 것입니다.One of the purposes is to encode values as ID, IDREF, and IDREFS. ID, IDREFIDREFS 키워드를 Directive로 지정할 수 있습니다.You can specify ID, IDREF, and IDREFS keywords as Directives. 이러한 지시어는 특성 유형을 덮어씁니다.These directives overwrite the attribute types. 이렇게 하면 문서 간 연결을 만들 수 있습니다.This allows you to create intra-document links.

또한 Directive 를 사용하여 문자열 데이터를 XML로 매핑하는 방법을 나타낼 수 있습니다.Also, you can use Directive to indicate how to map the string data to XML. hide, element, elementxsinil, xml, xmltextcdata 키워드는 Directive로 사용될 수 있습니다.The hide, element, elementxsinil, xml, xmltext, and cdata keywords can be used as the Directive. hide 지시어는 노드를 숨깁니다.The hide directive hides the node. 이 키워드는 정렬 목적으로만 값을 검색하고 결과 XML에는 표시되지 않도록 하려는 경우에 유용합니다.This is useful when you retrieve values only for sorting purposes, but you do not want them in the resulting XML.

element 지시어는 특성 대신 포함된 요소를 생성합니다.The element directive generates a contained element instead of an attribute. 포함된 데이터는 엔터티로 인코딩됩니다.The contained data is encoded as an entity. 예를 들어 < 문자는 <가 됩니다.For example, the < character becomes <. NULL 열 값에 대해 경우 요소가 생성되지 않습니다.For NULL column values, no element is generated. Null 열 값에 대해 요소를 생성하려면 elementxsinil 지시어를 지정합니다.If you want an element generated for null column values, you can specify the elementxsinil directive. 이렇게 하면 특성이 xsi:nil=TRUE인 요소가 생성됩니다.This will generate an element that has the attribute xsi:nil=TRUE.

xml 지시어는 element 지시어와 비슷하지만 엔터티 인코딩이 발생하지 않는다는 점이 다릅니다.The xml directive is the same as an element directive, except that no entity encoding occurs. element 지시어는 ID, IDREF또는 IDREFS와 조합될 수 있지만 xml 지시어는 hide를 제외한 다른 지시어와는 조합될 수 없습니다.Note that the element directive can be combined with ID, IDREF, or IDREFS, whereas the xml directive is not allowed with any other directive, except hide.

cdata 지시어는 CDATA 섹션으로 데이터를 묶어서 포함시킵니다.The cdata directive contains the data by wrapping it with a CDATA section. 내용은 인코딩된 엔터티가 아닙니다.The content is not entity encoded. 원래 데이터 형식은 varchar, nvarchar, text또는 ntext와 같은 텍스트 유형이어야 합니다.The original data type must be a text type such as varchar, nvarchar, text, or ntext. 이 지시어와 함께 사용할 수 있는 것은 hide뿐입니다.This directive can be used only with hide. 이 지시어를 사용할 때는 AttributeName 을 지정하지 말아야 합니다.When this directive is used, AttributeName must not be specified.

이러한 두 그룹 간 지시어 조합은 대부분의 경우 허용되지만 자체 그룹에서 지시어를 조합하는 것은 허용되지 않습니다.Combining directives between these two groups is allowed in most cases, but combining them among themselves is not allowed.

Customer!1 과 같은 DirectiveAttributeName이 지정되지 않은 경우 Customer!1!!element 와 같은 element지시어가 내포되고 열 데이터가 ElementName에 포함됩니다.If the Directive and the AttributeName is not specified, for example, Customer!1, an element directive is implied, such as Customer!1!!element, and column data is contained in the ElementName.

xmltext 지시어가 지정된 경우 열 내용은 문서의 나머지 부분에 통합된 단일 태그로 묶입니다.If the xmltext directive is specified, the column content is wrapped in a single tag that is integrated with the rest of the document. 이 지시어는 OPENXML에 의해 열에 저장된 사용되지 않은 오버플로 XML 데이터를 인출하는 데 유용합니다.This directive is useful in fetching overflow, unconsumed, XML data stored in a column by OPENXML. 자세한 내용은 OPENXML(SQL Server)을 참조하세요.For more information, see OPENXML (SQL Server).

AttributeName 이 지정된 경우 태그 이름이 지정된 이름으로 바뀝니다.If AttributeName is specified, the tag name is replaced by the specified name. 그렇지 않으면 엔터티 인코딩 없이 포함 내용의 시작 위치에 내용을 배치하여 묶는 요소의 현재 특성 목록에 특성이 포함됩니다.Otherwise, the attribute is appended to the current list of attributes of the enclosing elements by putting the content at the beginning of the containment without entity encoding. 이 지시어가 있는 열은 varchar, nvarchar, char, nchar, text또는 ntext와 같은 텍스트 유형이어야 합니다.The column with this directive must be a text type, such as varchar, nvarchar, char, nchar, text, or ntext. 이 지시어와 함께 사용할 수 있는 것은 hide뿐입니다.This directive can be used only with hide. 이 지시어는 열에 저장된 오버플로 데이터를 인출하는 데 유용합니다.This directive is useful in fetching overflow data stored in a column. 내용이 잘 작성된 XML이 아니면 동작이 정의되지 않습니다.If the content is not a well-formed XML, the behavior is undefined.

섹션 내용In This Section

다음 예에서는 EXPLICIT 모드를 사용하는 방법을 보여 줍니다.The following examples illustrate the use of EXPLICIT mode.

참고 항목See Also

FOR XML에서 RAW 모드 사용 Use RAW Mode with FOR XML
FOR XML에서 AUTO 모드 사용 Use AUTO Mode with FOR XML
FOR XML에서 PATH 모드 사용 Use PATH Mode with FOR XML
SELECT(Transact-SQL) SELECT (Transact-SQL)
FOR XML(SQL Server)FOR XML (SQL Server)