다음을 통해 공유


sql:key-fields를 사용하여 키 열 식별(XDR 스키마)

중요 정보중요

이 항목은 레거시 응용 프로그램에 대한 참조용으로 포함되었습니다. 이 기능에 대해서는 이후 개발 작업이 진행되지 않습니다. 새 개발 작업에서는 이 기능을 사용하지 마십시오. 대신 주석이 추가된 XSD 스키마를 사용하여 XML 뷰를 만드십시오. 자세한 내용은 주석이 추가된 XSD 스키마 소개(SQLXML 4.0)를 참조하십시오. 주석이 추가된 기존 XDR 스키마를 XSD 스키마로 변환할 수 있습니다. 자세한 내용은 주석이 추가된 XDR 스키마를 해당 XSD 스키마로 변환(SQLXML 4.0)을 참조하십시오.

XDR 스키마에 대해 XPath 쿼리가 지정된 경우 결과에서 올바른 중첩을 얻으려면 대부분 키 정보가 필요합니다. sql:key-fields 주석을 지정하면 적절한 계층이 생성됩니다.

[!참고]

결과에서 적절한 중첩을 얻으려면 모든 스키마에 sql:key-fields를 지정하는 것이 좋습니다.

대부분의 경우 적절한 XML 계층을 생성하려면 테이블의 행을 고유하게 식별하는 방법을 알아야 합니다. sql:key-fields 주석을 <element> 및 **<ElementType>**에 추가하여 테이블의 행을 고유하게 식별하는 열을 식별할 수 있습니다.

sql:key-fields 값은 **<ElementType>**에 지정된 관계의 행을 고유하게 식별하는 열을 식별합니다. 행을 고유하게 식별하는 데 둘 이상의 열이 필요한 경우 열 값이 공백으로 구분되어 나열됩니다.

sql:key-fields 주석은 요소와 자식 간에 정의되었지만 부모 요소에 지정된 테이블의 기본 키를 제공하지 않는 <sql:relationship> 및 자식 요소를 포함하는 요소 내에 지정해야 합니다.

다음 예를 사용하여 작업 예제를 만들려면 특정 요구 사항이 충족되어야 합니다. 자세한 내용은 SQLXML 예 실행을 위한 요구 사항을 참조하십시오.

1. <sql:relationship>에서 충분한 정보를 제공하지 않을 경우 올바른 중첩 생성

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

다음과 같은 스키마를 살펴 보십시오. 이 스키마는 <Order><Customer> 요소 간의 계층을 지정하며, 여기서 <Order> 요소는 부모이고 <Customer> 요소는 자식입니다.

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

**<Order>**에 sql:key-fields를 지정하면 이 주석은 부모(Sales.SalesOrderHeader 테이블)의 행을 고유하게 식별하며 자식 요소가 부모 아래에 나타납니다.

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

<?xml version="1.0" ?>
<Schema xmlns="urn:schemas-microsoft-com:xml-data"
        xmlns:dt="urn:schemas-microsoft-com:datatypes"
        xmlns:sql="urn:schemas-microsoft-com:xml-sql">
  <ElementType name="Customer" sql:relation="Sales.Customer">
    <AttributeType name="CustomerID" />
    <attribute type="CustomerID" />
  </ElementType>

  <ElementType name="Order" sql:relation="Sales.SalesOrderHeader" 
                            sql:key-fields="SalesOrderID" >
    <AttributeType name="SalesOrderID" />
    <AttributeType name="CustomerID" />
 
    <attribute type="SalesOrderID" />
    <attribute type="CustomerID" />
    <element type="Customer" >
             <sql:relationship
                         key-relation="Sales.SalesOrderHeader"
                         key="CustomerID"
                         foreign-relation="Sales.Customer"
                         foreign-key="CustomerID" />
    </element>
     </ElementType>
</Schema>

이 스키마의 작업 예제를 테스트하려면

  1. 위 스키마 코드를 복사한 후 텍스트 파일에 붙여넣습니다. 파일을 KeyFieldsA-Xdr.xml로 저장합니다.

  2. 다음 템플릿을 복사한 후 텍스트 파일에 붙여넣습니다. 파일을 KeyFieldsA-Xdr.xml을 저장한 디렉터리와 같은 디렉터리에 KeyFieldsA-XdrT.xml로 저장합니다.

    <ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
      <sql:xpath-query mapping-schema="KeyFieldsA-Xdr.xml">
        /Order
      </sql:xpath-query>
    </ROOT>
    

    매핑 스키마(KeyFieldsA-Xdr.xml)에 대해 지정된 디렉터리 경로는 템플릿이 저장된 디렉터리에 상대적입니다. 또한 다음과 같이 절대 경로를 지정할 수 있습니다.

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

    자세한 내용은 ADO를 사용하여 SQLXML 4.0 쿼리 실행을 참조하십시오.

결과 집합은 다음과 같습니다.

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
  <Order SalesOrderID="43659" CustomerID="676">
    <Customer CustomerID="676" /> 
  </Order>
  <Order SalesOrderID="43660" CustomerID="117">
    <Customer CustomerID="117" /> 
  </Order>
  <Order SalesOrderID="43661" CustomerID="442">
    <Customer CustomerID="442" /> 
  </Order>
  ...
</ROOT>

2. sql:key-fields를 지정하여 결과에서 올바른 중첩 생성

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

<?xml version="1.0" ?>
<Schema xmlns="urn:schemas-microsoft-com:xml-data"
   xmlns:dt="urn:schemas-microsoft-com:datatypes"
   xmlns:sql="urn:schemas-microsoft-com:xml-sql">
   <ElementType name="Title" content="textOnly"  >
      <AttributeType name="EmployeeID" />
      <attribute type="EmployeeID" />
   </ElementType>

   <ElementType name="HumanResources.Employee" sql:key-fields="EmployeeID" >
      <element type="Title" />
   </ElementType>
</Schema>

이 스키마의 작업 예제를 테스트하려면

  1. 위 스키마 코드를 복사한 후 텍스트 파일에 붙여넣습니다. 파일을 KeyFieldsB-Xdr.xml로 저장합니다.

  2. 다음 템플릿을 복사한 후 텍스트 파일에 붙여넣습니다. 파일을 KeyFieldsB-Xdr.xml을 저장한 디렉터리와 같은 디렉터리에 KeyFieldsB-XdrT.xml로 저장합니다. 템플릿의 XPath 쿼리에서는 <Order> 요소를 모두 반환합니다.

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

    매핑 스키마(KeyFieldsB-Xdr.xml)에 대해 지정된 디렉터리 경로는 템플릿이 저장된 디렉터리에 상대적입니다. 또한 다음과 같이 절대 경로를 지정할 수 있습니다.

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

    자세한 내용은 ADO를 사용하여 SQLXML 4.0 쿼리 실행을 참조하십시오.

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

<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>

참고 항목

참조