Процесс создания записей (SQLXML 4.0)
Область применения: SQL Server База данных SQL Azure
Массовая загрузка 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>
Схема задает элемент Customer с атрибутами CustomerID> и CompanyName.< Заметка 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> .
Внимание
В этой модели, поскольку запись вставляется при достижении закрывающего тега (или выхода узла из области), необходимо определить все данные, связанные с записью в области узла.
Подмножество записей и правило упорядочения ключа
При указании схемы сопоставления, использующего <sql:relationship>, термин подмножества относится к набору записей, создаваемых на внешней стороне связи. В следующем примере записи CustOrder находятся на внешней стороне sql:relationship>.<
Например, пусть база данных содержит следующие таблицы.
Cust (CustomerID, CompanyName, City);
CustOrder (CustomerID, OrderID).
Столбец CustomerID в таблице CustOrder является внешним ключом, под которым понимается первичный ключ CustomerID в таблице Cust.
Теперь рассмотрим представление XML, указанное в следующей схеме XSD с заметками. Эта схема использует <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-данных и шаги для создания рабочего образца.
Когда узел элемента Customer> в XML-файле данных входит в область, массовая <загрузка XML создает запись для таблицы Cust. Затем массовая загрузка XML копирует необходимые значения столбцов (CustomerID, CompanyName и City) из <CustomerID>,< CompanyName> и <дочерних элементов City>, как эти элементы входят в область.
Когда узел элемента Order> входит в область, массовая <загрузка XML создает запись для таблицы CustOrder. Массовая загрузка XML копирует значение атрибута OrderID в эту запись. Значение, необходимое для столбца CustomerID, получается из <дочернего <элемента CustomerID> элемента Customer>. Для получения значения внешнего ключа CustomerID для этой записи используется информация, указанная в sql:relationship>, если атрибут CustomerID не указан в элементе <Order>.< Общее правило заключается в том, что если дочерний элемент явно задает значение для атрибута внешнего ключа, XML Bulk Load использует это значение и не получает значение из родительского элемента с помощью указанного <sql:relationship>. Так как этот узел элемента Order выходит из области, массовая загрузка XML отправляет запись в SQL Server, а затем обрабатывает все последующие< узлы элементов Order>> таким же образом.<
Наконец, <узел элемента Customer> выходит из области. В то время массовая загрузка XML отправляет запись клиента в SQL Server. Массовая загрузка XML продолжает этот процесс для всех последующих клиентов в потоке XML-данных.
Два замечания о схеме сопоставления.
Если схема удовлетворяет правилу "сдерживания" (например, все данные, связанные с клиентом, и заказ определяется в пределах связанных узлов элементов Customer> и <Order>), массовая загрузка завершается успешно.<
Описывая <элемент Customer> , его дочерние элементы указываются в соответствующем порядке. В этом случае дочерний <элемент CustomerID> указывается перед дочерним элементом <Order>. Это означает, что в входном XML-файле данных значение элемента CustomerID> доступно в качестве значения внешнего ключа, когда <элемент Order> входит в область.< Первыми указываются ключевые атрибуты — это «правило упорядочения ключа».
Если указать дочерний элемент CustomerID> после дочернего< элемента Order, значение недоступно, когда< элемент Order>> входит в область.< <После чтения тега /Order> запись для таблицы CustOrder считается завершенной и вставляется в таблицу CustOrder со значением NULL для столбца CustomerID, который не является нужным результатом.
Создание рабочего образца
Сохраните схему, приведенную в этом примере, в файле 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 Visual Basic Scripting Edition (VBScript) (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. Необходимо убедиться, что в схеме приведено полное описание записи. Заметки dt:type="nmtokens" игнорируются так же, как и тип IDREFS.
Например, рассмотрим следующую схему XSD, описывающую <элементы Customer> и <Order> . Элемент <Customer> включает атрибут OrderList типа IDREFS. Тег <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.
Необходимо убедиться, что значения CustomerID и OrderID в элементе <Customer> соответствуют значениям< элемента 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 в файле 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=True objBL.Execute "c:\SampleSchema.xml", "c:\SampleXMLData.xml" set objBL=Nothing