OPENXML에서 메타 속성 지정

적용 대상:SQL ServerAzure SQL DatabaseAzure 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 노드를 참조합니다.

XML ID는 0 요소가 루트 요소임을 나타냅니다. 해당 부모 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의 오버플로 처리에 사용되는 요소 및 해당 특성의 텍스트 serialization 및 하위 요소입니다.

이 표에는 제공된 추가 부모 속성과 계층 구조에 대한 정보를 검색할 수 있는 상위 속성이 나와 있습니다.

부모 메타 속성 특성 설명
@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 문서의 한 열 행 집합 보기를 만듭니다. 이 열 Col1은 메타 속성에 xmltext 매핑되고 오버플로 열이 됩니다. 결과적으로 열은 미해결 데이터를 받습니다. 이 경우 전체 문서입니다.

그런 다음 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 문서의 행 집합 보기를 만듭니다. 이 예제에서는 메타 속성 특성을 OPENXML의 xmltext 행 집합 열에 매핑하여 연결되지 않은 XML 데이터를 검색하는 방법을 보여 줍니다.

열은 comment 메타 속성에 매핑하여 오버플로 열로 @mp:xmltext 식별됩니다. flags 매개 변수는 (XML_ATTRIBUTE 및 XML_NOCOPY)로 설정 9 됩니다. 이는 매핑을 나타내 attribute-centric 며, 연결되지 않은 데이터만 오버플로 열에 복사해야 임을 나타냅니다.

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

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

행 집합에 두 개의 추가 열이 지정되고 comment. parent 열이 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"/>

참고 항목