다음을 통해 공유


주석 해석 - sql:relationship 및 키 순서 규칙

적용 대상: SQL Server Azure SQL Database

XML 대량 로드는 노드가 범위에 들어갈 때 레코드를 생성하고 해당 레코드를 노드 종료 범위로 Microsoft SQL Server에 보내기 때문에 레코드의 데이터는 노드 범위 내에 있어야 합니다.

다음 XSD 스키마를 고려합니다. 여기서는 고객> 요소와< 주문> 요소 간의< 일대다 관계(한 고객이 많은 주문을 할 수 있습니다)는 sql:relationship> 요소를 사용하여 <지정됩니다.

<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> 요소 노드를< 처리할 때 XML 대량 로드는 sql:relationship>를 사용하여 <Customer 부모 요소에서< CustOrder 테이블의 CustomerID> 외래 키 열 값을 가져옵니다. Order> 요소는 CustomerID 특성을 지정하지 않기 때문<입니다. 즉, Customer> 요소를 정의할 때 sql:relationship><지정하기 전에 스키마에서 CustomerID 특성을 지정<해야 합니다. 그렇지 않으면 Order> 요소가 범위에 들어가면< XML 대량 로드가 CustOrder 테이블에 대한 레코드를 생성하고 XML 대량 로드가 /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 값을 삽입합니다. Order> 자식 요소 앞에< CustomerID> 자식 요소가 표시되도록 <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>