sql:relationship 및 키 순서 지정 규칙(SQLXML 4.0)

XML 대량 로드는 해당 노드의 범위가 시작될 때 레코드를 생성하고 해당 노드의 범위가 끝날 때 이러한 노드를 Microsoft SQL Server에 보내기 때문에 레코드의 데이터는 노드 범위 내에 있어야 합니다. 

<sql:relationship> 요소를 사용하여 <Customer> 요소와 <Order> 요소 간의 일 대 다 관계(고객 한 명이 여러 개의 주문을 할 수 있음)가 지정된 다음 XSD 스키마를 참조하십시오.

<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="CustCustOrder"
          parent="Cust"
          parent-key="CustomerID"
          child="CustOrder"
          child-key="CustomerID" />
  </xsd:appinfo>
</xsd:annotation>

  <xsd:element name="Customers" sql:relation="Cust" >
   <xsd:complexType>
     <xsd:sequence>
       <xsd:element name="CustomerID"  type="xsd:integer" />
       <xsd:element name="CompanyName" type="xsd:string" />
       <xsd:element name="City"        type="xsd:string" />
       <xsd:element name="Order" 
                          sql:relation="CustOrder"
                          sql:relationship="CustCustOrder" >
         <xsd:complexType>
          <xsd:attribute name="OrderID" type="xsd:integer" />
         </xsd:complexType>
       </xsd:element>
     </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
</xsd:schema>

<Customer> 요소 노드의 범위가 시작될 때 XML 대량 로드는 고객 레코드를 생성합니다. 이 레코드는 XML 대량 로드가 **</Customer>**를 읽을 때까지 유지됩니다. <Order> 요소가 CustomerID 특성을 지정하지 않기 때문에 XML 대량 로드는 <Order> 요소 노드를 처리할 때 <sql:relationship>을 사용하여 <Customer> 부모 요소에서 CustOrder 테이블의 외래 키 열 값을 가져옵니다. 즉, <Customer> 요소를 정의할 때 <sql:relationship>을 지정하기 전에 스키마에 CustomerID 특성을 지정해야 합니다. 그렇지 않으면 XML 대량 로드는 <Order> 요소의 범위가 시작될 때 CustOrder 테이블의 레코드를 생성하고 </Order> 끝 태그에 도달할 때 이 레코드를 CustomerID 외래 키 열 값 없이 SQL Server에 보냅니다.

이 예에서 제공하는 스키마를 SampleSchema.xml로 저장합니다.

작업 예제를 테스트하려면

  1. 다음 테이블을 만듭니다.

    CREATE TABLE Cust (
                  CustomerID     int          PRIMARY KEY,
               CompanyName    varchar(20)  NOT NULL,
                  City           varchar(20)  DEFAULT 'Seattle')
    GO
    CREATE TABLE CustOrder (
                  OrderID        varchar(10) PRIMARY KEY,
               CustomerID     int         FOREIGN KEY REFERENCES                                          Cust(CustomerID))
    GO
    
  2. 다음 예제 데이터를 SampleXMLData.xml로 저장합니다.

    <ROOT>  
      <Customers>
        <CompanyName>Hanari Carnes</CompanyName>
        <City>NY</City>
        <Order OrderID="1" />
        <Order OrderID="2" />
        <CustomerID>1111</CustomerID>
      </Customers>
      <Customers>
        <CompanyName>Toms Spezialitten</CompanyName>
         <City>LA</City>  
        <Order OrderID="3" />
        <CustomerID>1112</CustomerID>
      </Customers>
      <Customers>
        <CompanyName>Victuailles en stock</CompanyName>
        <Order OrderID="4" />
        <CustomerID>1113</CustomerID>
      </Customers>
    </ROOT>
    
  3. XML 대량 로드를 실행하려면 다음 Microsoft VBScript(Visual Basic Scripting Edition) 예제를 MySample.vbs로 저장한 다음 실행합니다.

    set objBL = CreateObject("SQLXMLBulkLoad.SQLXMLBulkload.4.0")
    objBL.ConnectionString = "provider=SQLOLEDB;data source=localhost;database=tempdb;integrated security=SSPI"
    objBL.ErrorLogFile = "c:\error.log"
    objBL.CheckConstraints = True
    objBL.Transaction=True
    objBL.Execute "c:\SampleSchema.xml", "c:\SampleXMLData.xml"
    set objBL=Nothing
    

    그러면 XML 대량 로드가 CustOrder 테이블의 CustomerID 외래 키 열에 NULL 값을 삽입합니다. <CustomerID> 자식 요소가 <Order> 자식 요소 앞에 오도록 XML 예제 데이터를 수정하면 예상대로 XML 대량 로드가 지정된 외래 키 값을 열에 삽입합니다.

다음은 이에 해당하는 XDR 스키마입니다.

<?xml version="1.0" ?>
<Schema xmlns="urn:schemas-microsoft-com:xml-data" 
        xmlns:dt="urn:schemas-microsoft-com:xml:datatypes"  
        xmlns:sql="urn:schemas-microsoft-com:xml-sql" > 
   <ElementType name="CustomerID"  />
   <ElementType name="CompanyName" />
   <ElementType name="City"        />

   <ElementType name="root" sql:is-constant="1">
      <element type="Customers" />
   </ElementType>

   <ElementType name="Customers" sql:relation="Cust" >
      <element type="CustomerID" sql:field="CustomerID" />
      <element type="CompanyName" sql:field="CompanyName" />
      <element type="City" sql:field="City" />
      <element type="Order" >
                 <sql:relationship
                        key-relation    ="Cust"
                        key             ="CustomerID"
                        foreign-key     ="CustomerID"
                        foreign-relation="CustOrder" />
      </element>
   </ElementType>
    <ElementType name="Order" sql:relation="CustOrder" >
      <AttributeType name="OrderID" />
      <AttributeType name="CustomerID" />
      <attribute type="OrderID" />
      <attribute type="CustomerID" />
    </ElementType>
</Schema>