sql:overflow-field (SQLXML 4.0)
В схеме можно указать столбец как столбец переполнения для того, чтобы получить все невостребованные данные из XML-документа. Этот столбец указывается в схеме с помощью заметки sql:overflow-field. Возможно иметь несколько столбцов переполнения.
Каждый раз, когда узел XML (элемент или атрибут), для которого существует заметка sql:overflow-field, определяющая входы в область, столбец переполнения активируется и получает невостребованные данные. Когда узел выходит за границы области, столбец переполнения перестает быть активным, и массовая загрузка XML делает активным предыдущее поле переполнения (если таковое имеется).
После того как она сохраняет данные в столбец переполнения, массовая загрузка XML также сохраняет открывающий и закрывающий теги родительского элемента, для которого определена заметка sql:overflow-field.
Например, следующая схема описывает элементы <Customers> и <CustOrder>. Каждый из данных элементов определяет столбец переполнения:
<?xml version="1.0" ?><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="ROOT" sql:is-constant="1"> <xsd:complexType> <xsd:sequence> <xsd:element name="Customers" sql:relation="Cust" sql:overflow-field="OverflowColumn"> <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" sql:overflow-field="OverflowColumn"> <xsd:complexType> <xsd:attribute name="OrderID"/> <xsd:attribute name="CustomerID"/> </xsd:complexType> </xsd:element> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:sequence> </xsd:complexType> </xsd:element></xsd:schema>
В схеме элемент <Customer> сопоставляется с таблицей «Cust», а элемент <Order> сопоставляется с таблицей "CustOrder".
Как элемент <Customer>, так и элемент <Order>, определяет столбец переполнения. Таким образом, массовая загрузка XML сохраняет все невостребованные дочерние элементы и атрибуты элемента <Customer> в столбец переполнения таблицы «Cust», а все невостребованные дочерние элементы и атрибуты элемента <Order> в столбец переполнения таблицы "CustOrder".
Проверка рабочего образца
Сохраните схему, приведенную в этом примере, в файле SampleSchema.xml.
Создайте следующие таблицы.
CREATE TABLE Cust ( CustomerID int PRIMARY KEY, CompanyName varchar(20) NOT NULL, City varchar(20) DEFAULT 'Seattle', OverflowColumn nvarchar(200))GOCREATE TABLE CustOrder ( OrderID int PRIMARY KEY, CustomerID int FOREIGN KEY REFERENCES Cust(CustomerID), OverflowColumn nvarchar(200))GO
Сохраните следующий образец XML-данных в файле SampleXMLData.xml.
<ROOT> <Customers> <CustomerID>1111</CustomerID> <CompanyName>Hanari Carnes</CompanyName> <City><![CDATA[NY]]> </City> <Junk>garbage in overflow</Junk> <Order OrderID="1" /> <Order OrderID="2" /> </Customers> <Customers> <CustomerID>1112</CustomerID> <CompanyName>Toms Spezialitten</CompanyName> <City><![CDATA[LA]]> </City> <xyz><address>111 Maple, Seattle</address></xyz> <Order OrderID="3" /> </Customers> <Customers> <CustomerID>1113</CustomerID> <CompanyName>Victuailles en stock</CompanyName> <Order OrderID="4" /> </Customers></ROOT>
Чтобы выполнить массовую загрузку XML-данных, сохраните этот пример на языке Microsoft Visual Basic Scripting Edition (VBScript) в файле Sample.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 = TrueobjBL.Execute "c:\SampleSchema.xml", "c:\SampleXMLData.xml"set objBL=Nothing