다음을 통해 공유


sql:key-fields를 사용하여 키 열 식별(SQLXML 4.0)

적용 대상: SQL ServerAzure SQL Database

XSD 스키마에 대해 XPath 쿼리를 지정하는 경우 대부분의 경우 결과에서 적절한 중첩을 얻기 위해 키 정보가 필요합니다. sql:key-fields 주석을 지정하는 것은 적절한 계층이 생성되도록 하는 방법입니다.

참고 항목

적절한 중첩을 보장하려면 테이블에 매핑되는 요소에 대해 sql:key-fields를 지정하는 것이 좋습니다. 생성된 XML은 기본 결과 집합의 순서에 민감합니다. sql:key-fields를 지정하지 않으면 생성된 XML이 제대로 구성되지 않을 수 있습니다.

sql:key-fields은 관계의 행을 고유하게 식별하는 열을 식별합니다. 행을 고유하게 식별하는 데 둘 이상의 열이 필요한 경우 열 값이 공백으로 구분됩니다.

요소와 자식 요소 사이에 정의되어 있지만 부모 요소에 지정된 테이블의 기본 키를 제공하지 않는 sql:relationship>가 요소에 포함되어< 있는 경우 sql:key-fields 주석을 사용해야 합니다.

예제

다음 예제를 사용하여 작업 샘플을 만들려면 특정 요구 사항을 충족해야 합니다. 자세한 내용은 SQLXML 실행 요구 사항 예제를 참조 하세요.

A. sql:relationship>에서 충분한 정보를 제공하지 않는 경우 <적절한 중첩 생성

이 예제에서는 sql:key-fields를 지정해야 하는 위치를 보여줍니다.

다음 스키마를 고려합니다. 스키마는 Order 요소가 부모이고 Customer 요소가 자식인 <Order> 요소와 <<Customer>> 요소 간의 <계층 구조를 지정합니다.>

<sql:relationship> 태그는 부모-자식 관계를 지정하는 데 사용됩니다. Sales.SalesOrderHeader 테이블의 CustomerID를 Sales.Customer 테이블의 CustomerID 자식 키를 참조하는 부모 키로 식별합니다. sql:relationship><제공된 정보만으로는 상위 테이블(Sales.SalesOrderHeader)의 행을 고유하게 식별할 수 없습니다. 따라서 sql:key-fields 주석이 없으면 생성되는 계층 구조가 정확하지 않습니다.

주문>에 <sql:key-fields를 지정하면 주석은 부모(Sales.SalesOrderHeader 테이블)의 행을 고유하게 식별하며 해당 자식 요소는 부모 아래에 표시됩니다.

스키마는 다음과 같습니다.

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"  
            xmlns:sql="urn:schemas-microsoft-com:mapping-schema">  
<xsd:annotation>  
  <xsd:appinfo>  
    <sql:relationship name="OrdCust"  
        parent="Sales.SalesOrderHeader"  
        parent-key="CustomerID"  
        child="Sales.Customer"  
        child-key="CustomerID" />  
  </xsd:appinfo>  
</xsd:annotation>  
  <xsd:element name="Order" sql:relation="Sales.SalesOrderHeader"   
               sql:key-fields="SalesOrderID">  
   <xsd:complexType>  
     <xsd:sequence>  
     <xsd:element name="Customer" sql:relation="Sales.Customer"   
                       sql:relationship="OrdCust"  >  
       <xsd:complexType>  
         <xsd:attribute name="CustID" sql:field="CustomerID" />  
         <xsd:attribute name="SoldBy" sql:field="SalesPersonID" />  
       </xsd:complexType>  
     </xsd:element>  
     </xsd:sequence>  
     <xsd:attribute name="SalesOrderID" type="xsd:integer" />  
     <xsd:attribute name= "CustomerID" type="xsd:string" />  
    </xsd:complexType>  
  </xsd:element>  
</xsd:schema>  
이 스키마의 작업 샘플을 만들려면
  1. 위 스키마 코드를 복사한 후 텍스트 파일에 붙여넣습니다. 파일을 KeyFields1.xml 저장합니다.

  2. 다음 템플릿을 복사하여 텍스트 파일에 붙여넣습니다. 파일을 KeyFields1.xml 저장한 동일한 디렉터리에 KeyFields1T.xml 저장합니다. 템플릿의 XPath 쿼리는 CustomerID가 <3보다 작은 모든 Order> 요소를 반환합니다.

    <ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">  
        <sql:xpath-query mapping-schema="KeyFields1.xml">  
            /Order[@CustomerID < 3]  
        </sql:xpath-query>  
    </ROOT>  
    

    매핑 스키마(KeyFields1.xml)에 지정된 디렉터리 경로는 템플릿이 저장된 디렉터리를 기준으로 합니다. 절대 경로도 지정할 수 있습니다. 예를 들면 다음과 같습니다.

    mapping-schema="C:\MyDir\KeyFields1.xml"  
    
  3. SQLXML 4.0 테스트 스크립트(Sqlxml4test.vbs)를 만들고 사용하여 템플릿을 실행합니다.

    자세한 내용은 ADO를 사용하여 SQLXML 쿼리를 실행합니다.

다음은 결과 집합의 일부입니다.

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">  
    <Order SalesOrderID="43860" CustomerID="1">  
       <Customer CustID="1" SoldBy="280"/>  
    </Order>  
    <Order SalesOrderID="44501" CustomerID="1">  
       <Customer CustID="1" SoldBy="280"/>  
    </Order>  
    <Order SalesOrderID="45283" CustomerID="1">  
       <Customer CustID="1" SoldBy="280"/>  
    </Order>  
    .....  
</ROOT>  

B. 결과에 적절한 중첩을 생성하도록 sql:key-fields 지정

다음 스키마에는 sql:relationship>를 사용하여 <지정된 계층 구조가 없습니다. 스키마에는 HumanResources.Employee 테이블에서 직원을 고유하게 식별하기 위해 sql:key-fields 주석을 지정해야 합니다.

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"  
            xmlns:sql="urn:schemas-microsoft-com:mapping-schema">  
  <xsd:element name="HumanResources.Employee" sql:key-fields="EmployeeID" >  
   <xsd:complexType>  
     <xsd:sequence>  
        <xsd:element name="Title">  
          <xsd:complexType>  
            <xsd:simpleContent>  
              <xsd:extension base="xsd:string">  
                 <xsd:attribute name="EmployeeID" type="xsd:integer" />  
              </xsd:extension>  
            </xsd:simpleContent>  
          </xsd:complexType>  
        </xsd:element>  
     </xsd:sequence>  
   </xsd:complexType>  
  </xsd:element>  
</xsd:schema>  
이 스키마의 작업 샘플을 만들려면
  1. 위 스키마 코드를 복사한 후 텍스트 파일에 붙여넣습니다. 파일을 KeyFields2.xml로 저장합니다.

  2. 다음 템플릿을 복사하여 텍스트 파일에 붙여넣습니다. KeyFields2.xml 저장한 디렉터리에 파일을 KeyFields2T.xml 저장합니다. 템플릿의 XPath 쿼리는 모든 <HumanResources.Employee> 요소를 반환합니다.

    <ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">  
      <sql:xpath-query mapping-schema="KeyFields2.xml">  
        /HumanResources.Employee  
      </sql:xpath-query>  
    </ROOT>  
    

    매핑 스키마(KeyFields2.xml)에 지정된 디렉터리 경로는 템플릿이 저장된 디렉터리를 기준으로 합니다. 절대 경로도 지정할 수 있습니다. 예를 들면 다음과 같습니다.

    mapping-schema="C:\MyDir\KeyFields2.xml"  
    
  3. SQLXML 4.0 테스트 스크립트(Sqlxml4test.vbs)를 만들고 사용하여 템플릿을 실행합니다.

    자세한 내용은 ADO를 사용하여 SQLXML 쿼리를 실행합니다.

다음은 결과입니다.

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">  
  <HumanResources.Employee>  
    <Title EmployeeID="1">Production Technician - WC60</Title>   
  </HumanResources.Employee>  
  <HumanResources.Employee>  
    <Title EmployeeID="2">Marketing Assistant</Title>   
  </HumanResources.Employee>  
  <HumanResources.Employee>  
    <Title EmployeeID="3">Engineering Manager</Title>   
  </HumanResources.Employee>  
  ...  
</ROOT>