레코드 생성 프로세스(SQLXML 4.0)
적용 대상: SQL Server Azure SQL Database
XML 대량 로드는 XML 입력 데이터를 처리하고 Microsoft SQL Server의 적절한 테이블에 대한 레코드를 준비합니다. XML 대량 로드의 논리는 새 레코드를 생성할 시기, 레코드 필드에 복사할 자식 요소 또는 특성 값, 레코드가 완료되고 삽입을 위해 SQL Server로 보낼 준비가 된 시기를 결정합니다.
XML 대량 로드는 전체 XML 입력 데이터를 메모리에 로드하지 않으며 SQL Server로 데이터를 보내기 전에 전체 레코드 집합을 생성하지 않습니다. XML 입력 데이터가 큰 문서일 수 있고 전체 문서를 메모리에 로드하는 데 비용이 많이 들 수 있기 때문입니다. 대신 XML 대량 로드는 다음을 수행합니다.
매핑 스키마를 분석하고 필요한 실행 계획을 준비합니다.
입력 스트림의 데이터에 실행 계획을 적용합니다.
이 순차적 처리에서는 XML 입력 데이터를 특정 방식으로 제공해야 하므로 XML 대량 로드가 매핑 스키마를 분석하는 방법과 레코드 생성 프로세스가 발생하는 방식을 이해해야 합니다. 이러한 이해를 통해 원하는 결과를 생성하는 XML 대량 로드에 대한 매핑 스키마를 제공할 수 있습니다.
XML 대량 로드는 열 및 테이블 매핑(주석을 사용하거나 기본 매핑을 통해 암시적으로 명시적으로 지정됨) 및 조인 관계를 비롯한 일반적인 매핑 스키마 주석을 처리합니다.
참고 항목
주석이 추가된 XSD 또는 XDR 매핑 스키마를 잘 알고 있다고 가정합니다. 스키마 에 대한 자세한 내용은 주석이 추가된 XSD 스키마(SQLXML 4.0) 또는 주석이 추가된 XDR 스키마 소개(SQLXML 4.0에서는 사용되지 않음)를 참조하세요.
레코드 생성을 이해하려면 다음 개념을 이해해야 합니다.
노드 범위
레코드 생성 규칙
레코드 하위 집합 및 키 순서 규칙
레코드 생성 규칙에 대한 예외
노드 범위
XML 문서의 노드(요소 또는 특성)는 XML 대량 로드가 XML 입력 데이터 스트림에서 노드를 발견하면 범위에 들어갑니다. 요소 노드의 경우 요소의 시작 태그는 요소 범위를 가져옵니다. 특성 노드의 경우 특성 이름은 범위 내의 특성을 가져옵니다.
노드는 끝 태그(요소 노드의 경우) 또는 특성 값의 끝(특성 노드의 경우)에 더 이상 데이터가 없을 때 범위를 남깁니다.
레코드 생성 규칙
노드(요소 또는 특성)가 범위에 들어가면 해당 노드에서 레코드를 생성할 가능성이 있습니다. 이러한 레코드는 연결된 노드가 범위에 속하는 동안 유지됩니다. 노드가 범위를 벗어나면 XML 대량 로드는 생성된 레코드를 완료(데이터 포함)로 간주하고 삽입을 위해 SQL Server로 보냅니다.
예를 들어 다음 XSD 스키마 조각을 고려합니다.
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:sql="urn:schemas-microsoft-com:mapping-schema">
<xsd:element name="Customer" sql:relation="Customers" >
<xsd:complexType>
<xsd:attribute name="CustomerID" type="xsd:string" />
<xsd:attribute name="CompanyName" type="xsd:string" />
</xsd:complexType>
</xsd:element>
</xsd:schema>
스키마는 CustomerID 및 CompanyName 특성을 사용하여 <Customer> 요소를 지정합니다. sql:relation 주석은 Customer 요소를 Customers> 테이블에 매핑<합니다.
XML 문서의 다음 조각을 고려합니다.
<Customer CustomerID="1" CompanyName="xyz" />
<Customer CustomerID="2" CompanyName="abc" />
...
XML 대량 로드가 이전 단락 및 XML 데이터에 설명된 스키마와 함께 입력으로 제공되면 다음과 같이 원본 데이터의 노드(요소 및 특성)를 처리합니다.
첫 번째 <Customer> 요소의 시작 태그는 해당 요소를 범위에 가져옵니다. 이 노드는 Customers 테이블에 매핑됩니다. 따라서 XML 대량 로드는 Customers 테이블에 대한 레코드를 생성합니다.
스키마에서 Customer 요소의 모든 특성은 <Customers> 테이블의 열에 매핑됩니다. 이러한 특성이 범위에 들어가면 XML 대량 로드는 부모 범위에서 이미 생성된 고객 레코드에 해당 값을 복사합니다.
XML 대량 로드가 Customer> 요소의 끝 태그에 <도달하면 요소가 범위를 벗어집니다. 이렇게 하면 XML 대량 로드에서 레코드가 완료된 것으로 간주하여 SQL Server로 보냅니다.
XML 대량 로드는 각 후속 <Customer> 요소에 대해 이 프로세스를 따릅니다.
Important
이 모델에서는 끝 태그에 도달할 때(또는 노드가 범위를 벗어날 때) 레코드가 삽입되므로 레코드와 관련된 모든 데이터를 노드 범위 내에 정의해야 합니다.
레코드 하위 집합 및 키 순서 규칙
sql:relationship>를 사용하는 <매핑 스키마를 지정하는 경우 하위 집합 용어는 관계의 외측에서 생성된 레코드 집합을 참조합니다. 다음 예제에서 CustOrder 레코드는 외세의 sql <:relationship>에 있습니다.
예를 들어 데이터베이스에 다음 테이블이 포함되어 있다고 가정합니다.
Cust(CustomerID, CompanyName, City)
CustOrder (CustomerID, OrderID)
CustOrder 테이블의 CustomerID는 Cust 테이블의 CustomerID 기본 키를 참조하는 외래 키입니다.
이제 다음과 같은 주석이 추가된 XSD 스키마에 지정된 XML 뷰를 고려해 보십시오. 이 스키마는 sql:relationship>를 사용하여 <Cust 테이블과 CustOrder 테이블 간의 관계를 지정합니다.
<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>
샘플 XML 데이터 및 작업 샘플을 만드는 단계는 다음과 같습니다.
XML 데이터 파일의 <Customer> 요소 노드가 범위에 들어가면 XML 대량 로드는 Cust 테이블에 대한 레코드를 생성합니다. 그런 다음 XML 대량 로드는 이러한 요소가 범위에 들어갈 때 CustomerID, CompanyName 및 City 자식 요소에서 <필요한 열 값(CustomerID>,< CompanyName> 및< City>)을 복사합니다.
Order> 요소 노드가 <범위에 들어가면 XML 대량 로드는 CustOrder 테이블에 대한 레코드를 생성합니다. XML 대량 로드는 OrderID 특성의 값을 이 레코드에 복사합니다. CustomerID 열에 필요한 값은 Customer> 요소의 <CustomerID> 자식 요소<에서 가져옵니다. XML 대량 로드는 Order> 요소에< CustomerID 특성이 지정되지 않은 한 sql:relationship>에 지정된 정보를 사용하여 이 레코드에 <대한 CustomerID 외래 키 값을 가져옵니다. 일반적인 규칙은 자식 요소가 외래 키 특성에 대한 값을 명시적으로 지정하는 경우 XML 대량 로드에서 해당 값을 사용하고 지정된 <sql:relationship>를 사용하여 부모 요소에서 값을 가져오지 않는 것입니다. 이 <Order> 요소 노드가 범위를 벗어나면 XML 대량 로드는 레코드를 SQL Server로 보낸 다음 모든 후속< Order> 요소 노드를 동일한 방식으로 처리합니다.
마지막으로 Customer> 요소 노드가 <범위를 벗어나갑니다. 이때 XML 대량 로드는 고객 레코드를 SQL Server로 보냅니다. XML 대량 로드는 XML 데이터 스트림의 모든 후속 고객에 대해 이 프로세스를 따릅니다.
다음은 매핑 스키마에 대한 두 가지 관찰 사항입니다.
스키마가 "포함" 규칙을 충족하면(예: 고객과 연결된 모든 데이터와 주문이 연결된 Customer> 및 <Order> 요소 노드의 범위 내에서 정의됨<) 대량 로드가 성공합니다.
Customer> 요소를 설명할 <때 해당 자식 요소는 적절한 순서로 지정됩니다. 이 경우 <CustomerID> 자식 요소는 Order> 자식 요소 앞에 <지정됩니다. 즉, <입력 XML 데이터 파일에서 Order> 요소가 범위에 들어갈 때 <CustomerID> 요소 값을 외래 키 값으로 사용할 수 있습니다. 키 특성이 먼저 지정됩니다. 이것이 "키 순서 규칙"입니다.
Order 자식 요소 뒤에 <CustomerID> 자식 요소를 지정<하면 Order>> 요소가 범위에 들어갈 때 <값을 사용할 수 없습니다. <그런 다음 /Order> 끝 태그를 읽으면 CustOrder 테이블에 대한 레코드가 완료된 것으로 간주되고 원하는 결과가 아닌 CustomerID 열에 대한 NULL 값이 있는 CustOrder 테이블에 삽입됩니다.
작업 샘플을 만들려면
이 예제에 제공된 스키마를 SampleSchema.xml 저장합니다.
다음 테이블을 만듭니다.
CREATE TABLE Cust ( CustomerID int PRIMARY KEY, CompanyName varchar(20) NOT NULL, City varchar(20) DEFAULT 'Seattle') GO CREATE TABLE CustOrder ( OrderID int PRIMARY KEY, CustomerID int FOREIGN KEY REFERENCES Cust(CustomerID)) GO
다음 예제 XML 입력 데이터를 SampleXMLData.xml로 저장합니다.
<ROOT> <Customers> <CustomerID>1111</CustomerID> <CompanyName>Hanari Carnes</CompanyName> <City>NY</City> <Order OrderID="1" /> <Order OrderID="2" /> </Customers> <Customers> <CustomerID>1112</CustomerID> <CompanyName>Toms Spezialitten</CompanyName> <City>LA</City> <Order OrderID="3" /> </Customers> <Customers> <CustomerID>1113</CustomerID> <CompanyName>Victuailles en stock</CompanyName> <Order OrderID="4" /> </Customers> </ROOT>
XML 대량 로드를 실행하려면 다음 Microsoft VBScript(Visual Basic Scripting Edition) 예제(BulkLoad.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.Execute "c:\SampleSchema.xml", "c:\SampleXMLData.xml" set objBL=Nothing
레코드 생성 규칙에 대한 예외
XML 대량 로드는 노드가 IDREF 또는 IDREFS 형식인 경우 범위에 들어갈 때 노드에 대한 레코드를 생성하지 않습니다. 스키마의 일부 위치에서 레코드에 대한 완전한 설명이 발생하는지 확인해야 합니다. IDREFS 형식이 무시되는 것처럼 dt:type="nmtokens" 주석은 무시됩니다.
예를 들어 Customer> 및 <Order> 요소를 설명하는 다음 XSD 스키마를 <고려해 보세요. <Customer> 요소에는 IDREFS 유형의 OrderList 특성이 포함됩니다. 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:attribute name="CustomerID" type="xsd:integer" />
<xsd:attribute name="CompanyName" type="xsd:string" />
<xsd:attribute name="City" type="xsd:string" />
<xsd:attribute name="OrderList"
type="xsd:IDREFS"
sql:relation="CustOrder"
sql:field="OrderID"
sql:relationship="CustCustOrder" >
</xsd:attribute>
</xsd:complexType>
</xsd:element>
<xsd:element name="Order" sql:relation="CustOrder" >
<xsd:complexType>
<xsd:attribute name="OrderID" type="xsd:string" />
<xsd:attribute name="CustomerID" type="xsd:integer" />
<xsd:attribute name="OrderDate" type="xsd:date" />
</xsd:complexType>
</xsd:element>
</xsd:schema>
대량 로드는 IDREFS 유형의 노드를 무시하므로 OrderList 특성 노드가 범위에 들어갈 때 레코드 생성이 없습니다. 따라서 Orders 테이블에 주문 레코드를 추가하려면 스키마의 어딘가에 해당 주문을 설명해야 합니다. 이 스키마에서 Order> 요소를 지정하면 <XML 대량 로드가 Orders 테이블에 주문 레코드를 추가합니다. <Order> 요소는 CustOrder 테이블의 레코드를 채우는 데 필요한 모든 특성을 설명합니다.
Customer> 요소의 CustomerID 및 OrderID 값이< Order> 요소의 값<과 일치하는지 확인해야 합니다. 참조 무결성을 유지할 책임이 있습니다.
작업 샘플을 테스트하려면
다음 테이블을 만듭니다.
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), OrderDate datetime DEFAULT '2000-01-01') GO
이 예제에 제공된 매핑 스키마를 SampleSchema.xml 저장합니다.
다음 예제 XML 데이터를 SampleXMLData.xml로 저장합니다.
<ROOT> <Customers CustomerID="1111" CompanyName="Sean Chai" City="NY" OrderList="Ord1 Ord2" /> <Customers CustomerID="1112" CompanyName="Dont Know" City="LA" OrderList="Ord3 Ord4" /> <Order OrderID="Ord1" CustomerID="1111" OrderDate="1999-01-01" /> <Order OrderID="Ord2" CustomerID="1111" OrderDate="1999-02-01" /> <Order OrderID="Ord3" CustomerID="1112" OrderDate="1999-03-01" /> <Order OrderID="Ord4" CustomerID="1112" OrderDate="1999-04-01" /> </ROOT>
XML 대량 로드를 실행하려면 이 VBScript 예(SampleVB.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.Execute "c:\SampleSchema.xml", "c:\SampleXMLData.xml" set objBL=Nothing