다음을 통해 공유


OPENXML에서 메타 속성 지정하기

적용 대상: SQL Server Azure SQL Database Azure SQL Managed Instance

XML 문서의 메타 속성 특성은 요소, 특성, 기타 DOM 노드 등 XML 항목의 속성을 설명하는 특성입니다. 이러한 특성은 XML 문서 텍스트에 물리적으로 존재하지 않습니다. 하지만 OPENXML은 모든 XML 항목에 대해 이러한 메타 속성을 제공합니다. 이러한 메타 속성을 통해 로컬 위치와 네임스페이스 정보 등 XML 노드의 정보를 추출할 수 있습니다. 이러한 정보는 텍스트 표현에 나타난 것보다 더 많은 세부 정보를 제공합니다.

ColPattern 매개 변수를 사용해 OPENXML 문의 행 집합 열에 이러한 메타 속성을 매핑할 수 있습니다. 열에는 매핑되는 메타 속성 값이 포함됩니다. OPENXML 구문에 대한 더 자세한 내용은 OPENXML (Transact-SQL) 참조.

메타 속성 특성에 액세스하기 위해 SQL Server 특유의 네임스페이스가 제공됩니다. 이러한 네임스페이스 urn:schemas-microsoft-com:xml-metaprop을 통해 사용자는 메타 속성 특성에 액세스할 수 있습니다. OPENXML 쿼리의 결과가 에지 테이블 형식으로 반환되는 경우 에지 테이블은 xmltext 메타 속성을 제외한 각 메타 속성 특성에 대해 하나의 열을 포함합니다.

일부 메타 속성 특성은 처리 목적을 위해 사용됩니다. 예를 들어, xmltext 메타 속성 특성은 오버플로 처리에 사용됩니다. 오버플로 처리는 소비되거나 처리되지 않은 문서 내 데이터를 참조합니다. OPENXML에 의해 생성된 행 집합의 열 중 하나를 오버플로 열로 식별할 수 있습니다. ColPattern 매개 변수를 사용해 해당 열을 xmltext 메타 속성에 매핑함으로써 이러한 작업을 수행합니다. 그러면 열이 오버플로 데이터를 수신합니다. flags 매개 변수는 해당 열에 모든 데이터 또는 소비되지 않은 데이터만 포함되는지 여부를 확인합니다.

아래 표에는 구문 분석된 각 XML 요소가 보유하는 메타 속성 특성이 열거되어 있습니다. 이러한 메타 속성 특성은 네임스페이스 urn:schemas-microsoft-com:xml-metaprop를 사용해 액세스할 수 있습니다. 이러한 메타 속성을 사용해 사용자가 XML 문서에 직접 설정하는 값은 무시됩니다.

참고 항목

XPath 탐색에서는 이러한 메타 속성을 참조할 수 없습니다.

메타 속성 특성 설명
@mp:id DOM 노드에 대해 시스템에서 생성된 문서 차원의 식별자를 제공합니다. 문서가 다시 구문 분석되지 않는 한 이 ID는 동일한 XML 노드를 참조합니다.

0의 XML ID는 해당 요소가 루트 요소임을 나타냅니다. 해당 부모 XML ID는 NULL입니다.
@mp:localname 노드 이름의 로컬 부분을 저장합니다. 이것은 접두사 및 네임스페이스 URI와 함께 요소 또는 특성 노드의 이름을 지정하는 데 사용됩니다.
@mp:namespaceuri 현재 요소의 네임스페이스 URI를 제공합니다. 이 특성의 값이 NULL이면 네임스페이스가 없는 것입니다.
@mp:prefix 현재 요소 이름의 네임스페이스 접두사를 저장합니다.

접두사가 없고(NULL) 하나의 URI가 주어지는 경우 이는 지정된 네임스페이스가 기본 네임스페이스임을 나타냅니다. URI가 주어지지 않을 경우 네임스페이스는 연결되지 않습니다.
@mp:prev 노드와 관련된 이전 형제를 저장합니다. 문서 내 요소의 순서에 관한 정보를 제공합니다.

@mp:prev 에는 동일한 부모 요소를 가진 이전 형제의 XML ID가 포함됩니다. 하나의 요소가 형제 목록의 앞에 있을 경우 @mp:prev는 NULL입니다.
@mp:xmltext 처리 목적으로 사용됩니다. OPENXML의 오버플로 처리에 사용되는 요소와 그 특성, 그리고 하위 요소의 텍스트 직렬화입니다.

아래의 표는 제공되는 추가 부모 속성을 나타낸 것으로 이를 통해 계층 구조에 관한 정보를 검색할 수 있습니다.

부모 메타 속성 특성 설명
@mp:parentid ../\@mp:id에 상응
@mp:parentlocalname ../\@mp:localname에 상응
@mp:parentnamespacerui ../\@mp:namespaceuri에 상응
@mp:parentprefix ../\@mp:prefix에 상응

예제

아래의 예제는 OPENXML을 사용해 다양한 행 집합 보기를 생성하는 방법을 보여줍니다.

A. OPENXML 행 집합 열을 메타 속성에 매핑하기

이 예제에서는 OPENXML을 사용해 샘플 XML 문서의 행 집합 보기를 생성합니다. 특히, ColPattern 매개 변수를 사용해 OPENXML 문의 행 집합 열에 다양한 메타 속성 특성을 매핑하는 법을 보여줍니다.

OPENXML 문은 다음을 보여 줍니다.

  • id 열은 @mp:id 메타 속성 특성에 매핑되며, 시스템에 의해 생성되는 요소의 고유 XML ID가 열에 포함됨을 나타냅니다.

  • parent 열은 @mp:parentid에 매핑되며, 요소 부모의 XML ID가 열에 포함됨을 나타냅니다.

  • parentLocalName 열은 @mp:parentlocalname에 매핑되며, 부모의 로컬 이름이 열에 포함됨을 나타냅니다.

다음으로 SELECT 문은 OPENXML에서 제공하는 행 집합을 반환합니다.

DECLARE @idoc int;
DECLARE @doc nvarchar(1000);
-- Sample XML document
SET @doc = N'<root>
  <Customer cid= "C1" name="Janine" city="Issaquah">
      <Order oid="O1" date="1/20/1996" amount="3.5" />
      <Order oid="O2" date="4/30/1997" amount="13.4">Customer was very satisfied</Order>
   </Customer>
   <Customer cid="C2" name="Ursula" city="Oelde" >
      <Order oid="O3" date="7/14/1999" amount="100" note="Wrap it blue white red">
          <Urgency>Important</Urgency>
      </Order>
      <Order oid="O4" date="1/20/1996" amount="10000"/>
   </Customer>
</root>';
-- Create an internal representation of the XML document.
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc;

-- Execute a SELECT statement using OPENXML rowset provider.
SELECT *
FROM OPENXML (@idoc, '/root/Customer/Order', 9)
      WITH (id int '@mp:id',
            oid char(5),
            date datetime,
            amount real,
            parentIDNo int '@mp:parentid',
            parentLocalName varchar(40) '@mp:parentlocalname');
EXEC sp_xml_removedocument @idoc;

다음은 결과입니다.

id   oid         date                amount    parentIDNo  parentLocalName
--- ------- ---------------------- ---------- ------------ ---------------
6    O1    1996-01-20 00:00:00.000     3.5         2        Customer
10   O2    1997-04-30 00:00:00.000     13.4        2        Customer
19   O3    1999-07-14 00:00:00.000     100.0       15       Customer
25   O4    1996-01-20 00:00:00.000     10000.0     15       Customer

B. 전체 XML 문서 검색하기

이 예제에서는 OPENXML을 사용해 샘플 XML 문서의 1열 행 집합 보기를 생성합니다. 이러한 열 Col1xmltext 메타 속성에 매핑되며 오버플로 열이 됩니다. 결과적으로 열은 소비되지 않은 데이터를 받습니다. 이 경우 소비되지 않은 데이터는 전체 문서입니다.

다음으로 SELECT 문은 전체 행 집합을 반환합니다.

DECLARE @idoc int;
DECLARE @doc nvarchar(1000);
SET @doc = N'<?xml version="1.0"?>
<root>
  <Customer cid= "C1" name="Janine" city="Issaquah">
      <Order oid="O1" date="1/20/1996" amount="3.5" />
      <Order oid="O2" date="4/30/1997" amount="13.4">Customer was very
             satisfied</Order>
   </Customer>
   <Customer cid="C2" name="Ursula" city="Oelde" >
      <Order oid="O3" date="7/14/1999" amount="100" note="Wrap it blue
             white red">
     <MyTag>Testing to see if all the subelements are returned</MyTag>
          <Urgency>Important</Urgency>
      </Order>
      <Order oid="O4" date="1/20/1996" amount="10000"/>
   </Customer>
</root>';
-- Create an internal representation of the XML document.
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc;

-- Execute a SELECT statement using OPENXML rowset provider.
SELECT *
FROM OPENXML (@idoc, '/')
   WITH (Col1 ntext '@mp:xmltext')

XML을 선언하지 않고 전체 문서를 검색하기 위해 다음과 같이 쿼리를 지정할 수 있습니다.

SELECT *
FROM OPENXML (@idoc, '/root')
   WITH (Col1 ntext '@mp:xmltext')
EXEC sp_xml_removedocument @idoc;

쿼리는 이름 루트가 포함된 루트 요소와 해당 루트 요소에 포함된 데이터를 반환합니다.

C. xmltext 메타 속성을 지정해 열에서 소비되지 않은 데이터 검색하기

이 예제에서는 OPENXML을 사용해 샘플 XML 문서의 행 집합 보기를 생성합니다. 예제는 xmltext 메타 속성 특성을 OPENXML의 행 집합 열에 매핑함으로써 소비되지 않은 XML 데이터를 검색하는 방법을 보여줍니다.

comment 열은 @mp:xmltext 메타 속성에 매핑됨으로써 오버플로 열로 식별됩니다. flags 매개 변수는 9 (XML_ATTRIBUTE 및 XML_NOCOPY)로 설정됩니다. 이는 attribute-centric 매핑을 나타냅니다. 또 소비되지 않은 데이터만이 오버플로 열에 복사되어야 함을 나타냅니다.

다음으로 SELECT 문은 OPENXML에서 제공하는 행 집합을 반환합니다.

이 예제에서는 OPENXML에서 생성되는 행 집합의 한 열 ParentLocalName에 대해 @mp:parentlocalname 메타 속성이 설정됩니다. 결과적으로 이 열에는 부모 요소의 로컬 이름이 포함됩니다.

두 개의 추가 열이 행 집합 parentcomment에 지정됩니다. parent 열은 @mp:parentid에 매핑되며, 요소 부모 요소의 XML ID가 열에 포함됨을 나타냅니다. 설명 열은 @mp:xmltext 메타 속성에 매핑됨으로써 오버플로 열로 식별됩니다.

DECLARE @idoc int;
DECLARE @doc nvarchar(1000);
-- sample XML document
SET @doc = N'<root>
  <Customer cid= "C1" name="Janine" city="Issaquah">
      <Order oid="O1" date="1/20/1996" amount="3.5" />
      <Order oid="O2" date="4/30/1997" amount="13.4">Customer was very satisfied</Order>
   </Customer>
   <Customer cid="C2" name="Ursula" city="Oelde" >
      <Order oid="O3" date="7/14/1999" amount="100" note="Wrap it blue white red">
          <Urgency>Important</Urgency>
      </Order>
      <Order oid="O4" date="1/20/1996" amount="10000"/>
   </Customer>
</root>
';
-- Create an internal representation of the XML document.
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc;

-- Execute a SELECT statement using OPENXML rowset provider.
SELECT *
FROM OPENXML (@idoc, '/root/Customer/Order', 9)
      WITH (oid char(5),
            date datetime,
            comment ntext '@mp:xmltext');
EXEC sp_xml_removedocument @idoc;

다음은 결과입니다. oid 열과 날짜 열은 이미 소비되었으므로 오버플로 열에 표시되지 않습니다.

oid   date                        comment
----- --------------------------- ----------------------------------------
O1    1996-01-20 00:00:00.000     <Order amount="3.5"/>
O2    1997-04-30 00:00:00.000     <Order amount="13.4">Customer was very
                                   satisfied</Order>
O3    1999-07-14 00:00:00.000     <Order amount="100" note="Wrap it blue
                                   white red"><Urgency>
                                   Important</Urgency></Order>
O4    1996-01-20 00:00:00.000     <Order amount="10000"/>

참고 항목