적용 대상: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 부모 요소에서<> 외래 키 열 값을 가져옵니다. Order 요소는 CustomerID<하지 않기 때문>입니다. 즉, Customer<>해야 합니다. 그렇지 않으면 Order< 요소가 범위에 들어가면> XML 대량 로드가 CustOrder 테이블에 대한 레코드를 생성하고 XML 대량 로드가 /Order>하면 CustomerID 외래 키 열 값 없이 레코드를 SQL Server로 보냅니다.
이 예제에 제공된 스키마를 SampleSchema.xml 저장합니다.
작업 샘플을 테스트하려면
다음 테이블을 만듭니다.
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다음 샘플 데이터를 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>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>