다음을 통해 공유


예: XMLTEXT 지시문 지정

이 예제에서는 EXPLICIT 모드를 사용하는 문 SELECT에서 지시문 XMLTEXT을 사용하여 오버플로 열의 데이터를 처리하는 방법을 보여 줍니다.

Person 테이블을 고려하십시오. 이 표에는 Overflow XML 문서의 미해결 부분을 저장하는 열이 있습니다.

USE tempdb;  
GO  
CREATE TABLE Person(PersonID varchar(5), PersonName varchar(20), Overflow nvarchar(200));  
GO  
INSERT INTO Person VALUES   
    ('P1','Joe',N'<SomeTag attr1="data">content</SomeTag>')  
   ,('P2','Joe',N'<SomeTag attr2="data"/>')  
   ,('P3','Joe',N'<SomeTag attr3="data" PersonID="P">content</SomeTag>');  

이 쿼리는 테이블에서 열을 검색합니다 Person . 열 Overflow의 경우 AttributeName이 지정되지 않았지만, 지시문은 범용 테이블 열 이름을 제공하기 위해 XMLTEXT으로 설정됩니다.

SELECT 1 as Tag, NULL as parent,  
       PersonID as [Parent!1!PersonID],  
       PersonName as [Parent!1!PersonName],  
       Overflow as [Parent!1!!XMLTEST] -- No AttributeName; XMLTEXT directive  
FROM Person  
FOR XML EXPLICIT;  

결과 XML 문서에서 다음을 수행합니다.

  • AttributeNameOverflow 열에 대해 지정되지 않았고, xmltext 지시문이 지정되었기 때문에, <overflow> 요소의 속성들이 바깥쪽 <Parent> 요소의 속성 목록에 추가됩니다.

  • 동일한 요소 수준에서 검색된 PersonID 특성과 요소의 PersonID<xmltext> 속성이 충돌하기 때문에, PersonID가 NULL일 때도 <xmltext> 요소의 속성은 무시됩니다. 일반적으로 특성은 오버플로에서 동일한 이름의 특성을 재정의합니다.

다음은 결과입니다.

<Parent PersonID="P1" PersonName="Joe" attr1="data">content</Parent>

<Parent PersonID="P2" PersonName="Joe" attr2="data"></Parent>

<Parent PersonID="P3" PersonName="Joe" attr3="data">content</Parent>

오버플로 데이터에 하위 요소가 있고 동일한 쿼리가 지정되면 열의 Overflow 하위 요소가 바깥쪽 <Parent> 요소의 하위 요소로 추가됩니다.

예를 들어 열에 하위 행이 Person 있도록 테이블의 Overflow 데이터를 변경합니다.

USE tempdb;  
GO  
TRUNCATE TABLE Person;  
GO  
INSERT INTO Person VALUES   
    ('P1','Joe',N'<SomeTag attr1="data">content</SomeTag>')  
   ,('P2','Joe',N'<SomeTag attr2="data"/>')  
    ,('P3','Joe',N'<SomeTag attr3="data" PersonID="P"><name>PersonName</name></SomeTag>');  

동일한 쿼리가 실행되면 요소의 하위 <xmltext> 요소가 바깥쪽 <Parent> 요소의 하위 요소로 추가됩니다.

SELECT 1 as Tag, NULL as parent,  
       PersonID as [Parent!1!PersonID],  
       PersonName as [Parent!1!PersonName],  
       Overflow as [Parent!1!!XMLTEXT] -- no AttributeName, XMLTEXT directive  
FROM Person  
FOR XML EXPLICIT;  

다음은 결과입니다.

<Parent PersonID="P1" PersonName="Joe" attr1="data">content</Parent>

<Parent PersonID="P2" PersonName="Joe" attr2="data"></Parent>

<Parent PersonID="P3" PersonName="Joe" attr3="data">

<name>PersonName</name>

</Parent>

AttributeNamexmltext 지시문과 함께 지정하면 <overflow> 요소의 속성이 포함하는 <Parent> 요소의 하위 요소 속성으로 추가됩니다. AttributeName에 지정된 이름은 하위 요소의 이름이 됩니다.

이 쿼리에서 AttributeName<overflow>은 지시문과 xmltext 함께 지정됩니다.

SELECT 1 as Tag, NULL as parent,  
       PersonID as [Parent!1!PersonID],  
       PersonName as [Parent!1!PersonName],  
       Overflow as [Parent!1!overflow!XMLTEXT] -- Overflow is AttributeName  
                      -- XMLTEXT is a directive  
FROM Person  
FOR XML EXPLICIT  

다음은 결과입니다.

<Parent PersonID="P1" PersonName="Joe">

<overflow attr1="data">content</overflow>

</Parent>

<Parent PersonID="P2" PersonName="Joe">

<overflow attr2="data" />

</Parent>

<Parent PersonID="P3" PersonName="Joe">

<overflow attr3="data" PersonID="P">

<name>PersonName</name>

</overflow>

</Parent>

이 쿼리 요소에서는 지시어PersonName 속성에 지정됩니다. 그러면 PersonName 바깥쪽 <Parent> 요소의 하위 요소로 추가됩니다. < xmltext >의 특성은 여전히 바깥쪽 <Parent> 요소에 추가되어 있습니다. < overflow > 요소의 내용은 바깥 <Parent> 요소의 다른 하위 요소들 앞에 추가됩니다.

SELECT 1      AS Tag, NULL as parent,  
       PersonID   AS [Parent!1!PersonID],  
       PersonName AS [Parent!1!PersonName!element], -- element directive  
       Overflow   AS [Parent!1!!XMLTEXT]  
FROM Person  
FOR XML EXPLICIT;  

다음은 결과입니다.

<Parent PersonID="P1" attr1="data">content<PersonName>Joe</PersonName>

</Parent>

<Parent PersonID="P2" attr2="data">

<PersonName>Joe</PersonName>

</Parent>

<Parent PersonID="P3" attr3="data">

<name>PersonName</name>

<PersonName>Joe</PersonName>

</Parent>

XMLTEXT 열 데이터에 루트 요소의 특성이 포함된 경우 이러한 특성은 XML 데이터 스키마에 표시되지 않으며 MSXML 파서는 결과 XML 문서 조각의 유효성을 검사하지 않습니다. 다음은 그 예입니다.

SELECT 1 AS Tag,  
       0 ASParent,  
       N'<overflow a="1"/>' AS 'overflow!1!!xmltext'  
FOR XML EXPLICIT, xmldata;  

다음은 결과입니다. 반환된 스키마에서 오버플로 특성 a 은 스키마에서 누락됩니다.

<Schema name="Schema2"

xmlns="urn:schemas-microsoft-com:xml-data"

xmlns:dt="urn:schemas-microsoft-com:datatypes">

<ElementType name="overflow" content="mixed" model="open">

</ElementType>

</Schema>

<overflow xmlns="x-schema:#Schema2" a="1">

</overflow>

또한 참조하십시오

FOR XML에서 EXPLICIT 모드 사용