Поделиться через


Примеры массовой загрузки XML (SQLXML 4.0)

В следующих примерах показана функциональность массовой загрузки XML в Microsoft SQL Server. Каждый пример предоставляет XSD-схему и ее эквивалентную XDR-схему.

Сценарий массового загрузчика (ValidateAndBulkload.vbs)

Следующий сценарий, выполненный на языке Microsoft Visual Basic Scripting Edition (VBScript), загружает XML-документ в XML DOM; проверяет его на соответствие схеме; и если документ допустим, выполняет массовую загрузку XML, чтобы загрузить XML в таблицу SQL Server. Этот сценарий можно использовать с каждым из отдельных примеров, которые ссылаются на него далее в этом разделе.

ПримечаниеПримечание

Массовая загрузка XML не выдает предупреждение или ошибку, если загрузка содержимого из файла данных не была выполнена. Поэтому рекомендуется проверить файл XML-данных перед выполнением операции массовой загрузки.

Dim FileValidset objBL = CreateObject("SQLXMLBulkLoad.SQLXMLBulkload.4.0")objBL.ConnectionString = "provider=SQLOLEDB;data source=MyServer;database=tempdb;integrated security=SSPI"objBL.ErrorLogFile = "c:\error.log"'Validate the data file prior to bulkloadDim sOutput sOutput = ValidateFile("SampleXMLData.xml", "", "SampleSchema.xml")WScript.Echo sOutputIf FileValid Then   ' Check constraints and initiate transaction (if needed)   ' objBL.CheckConstraints = True   ' objBL.Transaction=True  'Execute XML bulkload using file.  objBL.Execute "SampleSchema.xml", "SampleXMLData.xml"  set objBL=NothingEnd IfFunction ValidateFile(strXmlFile,strUrn,strXsdFile)       ' Create a schema cache and add SampleSchema.xml to it.   Dim xs, fso, sAppPath   Set fso = CreateObject("Scripting.FileSystemObject")    Set xs = CreateObject("MSXML2.XMLSchemaCache.6.0")   sAppPath = fso.GetFolder(".")    xs.Add strUrn, sAppPath & "\" & strXsdFile   ' Create an XML DOMDocument object.   Dim xd    Set xd = CreateObject("MSXML2.DOMDocument.6.0")   ' Assign the schema cache to the DOM document.   ' schemas collection.   Set xd.schemas = xs   ' Load XML document as DOM document.   xd.async = False   xd.Load sAppPath & "\" & strXmlFile   ' Return validation results in message to the user.   If xd.parseError.errorCode <> 0 Then        ValidateFile = "Validation failed on " & _             strXmlFile & vbCrLf & _             "=====================" & vbCrLf & _             "Reason: " & xd.parseError.reason & _             vbCrLf & "Source: " & _             xd.parseError.srcText & _             vbCrLf & "Line: " & _             xd.parseError.Line & vbCrLf             FileValid = False    Else        ValidateFile = "Validation succeeded for " & _             strXmlFile & vbCrLf & _             "======================" & _             vbCrLf & "Contents to be bulkloaded" & vbCrLf             FileValid = True    End IfEnd Function

А. Массовая загрузка XML-данных в таблицу

Этот пример устанавливает соединение с экземпляром SQL Server, указанным в свойстве ConnectionString (MyServer). Пример также задает свойство ErrorLogFile. Поэтому ошибочный вывод сохраняется в указанном файле («C:\error.log»), который также можно переместить в другое место. Обратите внимание, что в качестве параметров метода Execute используются как файл схемы сопоставления (SampleSchema.xml), так и файл XML-данных (SampleXMLData.xml). Когда выполняется массовая загрузка, таблица Cust, созданная в базе данных tempdb будет содержать новые записи, на основе содержимого файла XML-данных.

Проверка образца массовой загрузки

  1. Создайте такую таблицу:

    CREATE TABLE Cust(CustomerID  int PRIMARY KEY,                  CompanyName varchar(20),                  City        varchar(20))GO
    
  2. В редакторе текста или XML по своему выбору создайте файл и сохраните его под именем SampleSchema.vbs. Добавьте в этот файл следующую XSD-схему:

    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"            xmlns:sql="urn:schemas-microsoft-com:mapping-schema">   <xsd:element name="ROOT" sql:is-constant="1" >     <xsd:complexType>       <xsd:sequence>         <xsd:element name="Customers" sql:relation="Cust" maxOccurs="unbounded">           <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:sequence>           </xsd:complexType>         </xsd:element>       </xsd:sequence>      </xsd:complexType>     </xsd:element></xsd:schema>
    
  3. В редакторе текста или XML по своему выбору создайте файл и сохраните его под именем SampleXMLData.vbs. Добавьте в этот файл следующий XML-документ:

    <ROOT>  <Customers>    <CustomerID>1111</CustomerID>    <CompanyName>Sean Chai</CompanyName>    <City>New York</City>  </Customers>  <Customers>    <CustomerID>1112</CustomerID>    <CompanyName>Tom Johnston</CompanyName>     <City>Los Angeles</City>  </Customers>  <Customers>    <CustomerID>1113</CustomerID>    <CompanyName>Institute of Art</CompanyName>    <City>Chicago</City>  </Customers></ROOT>
    
  4. В редакторе текста или XML по своему выбору создайте файл и сохраните его под именем ValidateAndBulkload.vbs. Добавьте в этот файл код VBScript, приведенный в начале этого подраздела. Измените строку соединения, указав соответствующее имя сервера. Укажите соответствующий путь для файлов, которые заданы в качестве параметров для метода Execute.

  5. Выполните код VBScript. Массовая загрузка XML загружает XML в таблицу Cust.

Эквивалентная схема 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" dt:type="int" />   <ElementType name="CompanyName" dt:type="string" />   <ElementType name="City" dt:type="string" />   <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" />   </ElementType></Schema>

Б. Массовая загрузка XML-данных в несколько таблиц.

В этом примере XML-документ состоит из элементов <Customer> и <Order>.

<ROOT>  <Customers>    <CustomerID>1111</CustomerID>    <CompanyName>Sean Chai</CompanyName>    <City>NY</City>    <Order OrderID="1" />    <Order OrderID="2" />  </Customers>  <Customers>    <CustomerID>1112</CustomerID>    <CompanyName>Tom Johnston</CompanyName>     <City>LA</City>      <Order OrderID="3" />  </Customers>  <Customers>    <CustomerID>1113</CustomerID>    <CompanyName>Institute of Art</CompanyName>    <Order OrderID="4" />  </Customers></ROOT>

В этом примере выполняется массовая загрузка XML-данных в две таблицы, Cust и CustOrder:

Cust(CustomerID, CompanyName, City)CustOrder(OrderID, CustomerID)

Следующая XML-схема определяет XML-представление этих таблиц. Схема задает связи типа «родители-потомки» между элементами <Customer> и <Order>.

<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" >          <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:sequence>    </xsd:complexType>  </xsd:element></xsd:schema>

Массовая загрузка XML-данных использует связь «первичный ключ — внешний ключ» между элементами <Cust> и <CustOrder>.

Проверка образца массовой загрузки

  1. В базе данных tempdb создайте две таблицы:

    USE tempdbCREATE TABLE Cust(       CustomerID  int PRIMARY KEY,       CompanyName varchar(20),       City        varchar(20))CREATE TABLE CustOrder(        OrderID     int PRIMARY KEY,         CustomerID int FOREIGN KEY REFERENCES Cust(CustomerID))
    
  2. В редакторе текста или XML по своему выбору создайте файл и сохраните его под именем SampleSchema.xml. Добавьте в этот файл схему XSD, приведенную в данном примере.

  3. В редакторе текста или XML по своему выбору создайте файл и сохраните его под именем SampleData.xml. Добавьте в этот файл XML-документ, приведенный ранее в данном примере.

  4. В редакторе текста или XML по своему выбору создайте файл и сохраните его под именем ValidateAndBulkload.vbs. Добавьте в этот файл код VBScript, приведенный в начале этого подраздела. Измените строку соединения, указав соответствующие имена сервера и базы данных. Укажите соответствующий путь для файлов, которые заданы в качестве параметров для метода Execute.

  5. Выполните приведенный выше код VBScript. Массовая загрузка XML загружает XML-документ в таблицы Cust и CustOrder.

Эквивалентная схема 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" dt:type="int" />   <ElementType name="CompanyName" dt:type="string" />   <ElementType name="City" dt:type="string" />   <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>

В. Использование цепочечных связей в схеме для массовой загрузки XML

Этот пример показывает, как связь M:N, указанная в схеме сопоставления, используется для массовой XML-загрузки данных, представляющих связь M:N.

В качестве примера рассмотрим следующую схему XSD.

<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="OrderOD"          parent="Ord"          parent-key="OrderID"          child="OrderDetail"          child-key="OrderID" />    <sql:relationship name="ODProduct"          parent="OrderDetail"          parent-key="ProductID"          child="Product"          child-key="ProductID"           inverse="true"/>  </xsd:appinfo></xsd:annotation>  <xsd:element name="ROOT" sql:is-constant="1" >    <xsd:complexType>      <xsd:sequence>        <xsd:element name="Order"                      sql:relation="Ord"                      sql:key-fields="OrderID" >          <xsd:complexType>            <xsd:sequence>             <xsd:element name="Product"                          sql:relation="Product"                           sql:key-fields="ProductID"                          sql:relationship="OrderOD ODProduct">               <xsd:complexType>                 <xsd:attribute name="ProductID" type="xsd:int" />                 <xsd:attribute name="ProductName" type="xsd:string" />               </xsd:complexType>             </xsd:element>           </xsd:sequence>           <xsd:attribute name="OrderID"   type="xsd:integer" />            <xsd:attribute name="CustomerID"   type="xsd:string" />         </xsd:complexType>       </xsd:element>      </xsd:sequence>    </xsd:complexType>  </xsd:element></xsd:schema>

Схема указывает элемент <Order> с дочерним элементом <Product>. Элемент <Order> сопоставляется таблице Ord, а элемент <Product> сопоставляется таблице Product в базе данных. Цепочечная связь, заданная на элементе <Product>, указывает связь M:N, представленную таблицей OrderDetail. (В заказ может входить много продуктов, и продукт может входить во много заказов.)

При массовой загрузке XML-документа с этой схемой записи добавляются к таблицам Ord, Product и OrderDetail.

Проверка рабочего образца

  1. Создайте три таблицы:

    CREATE TABLE Ord (         OrderID     int  PRIMARY KEY,         CustomerID  varchar(5))GOCREATE TABLE Product (         ProductID   int PRIMARY KEY,         ProductName varchar(20))GOCREATE TABLE OrderDetail (       OrderID     int FOREIGN KEY REFERENCES Ord(OrderID),       ProductID   int FOREIGN KEY REFERENCES Product(ProductID),                   CONSTRAINT OD_key PRIMARY KEY (OrderID, ProductID))GO
    
  2. Сохраните схему, приведенную выше в этом примере как файл SampleSchema.xml.

  3. Сохраните следующий образец XML-данных в файле SampleXMLData.xml.

    <ROOT>    <Order OrderID="1" CustomerID="ALFKI">    <Product ProductID="1" ProductName="Chai" />    <Product ProductID="2" ProductName="Chang" />  </Order>  <Order OrderID="2" CustomerID="ANATR">    <Product ProductID="3" ProductName="Aniseed Syrup" />    <Product ProductID="4" ProductName="Gumbo Mix" />  </Order></ROOT>
    
  4. В редакторе текста или XML по своему выбору создайте файл и сохраните его под именем ValidateAndBulkload.vbs. Добавьте в этот файл код VBScript, приведенный в начале этого подраздела. Измените строку соединения, указав соответствующие имена сервера и базы данных. Снимите комментарий со следующих строк исходного текста для этого примера.

    objBL.CheckConstraints = TrueobjBL.Transaction=True
    
  5. Выполните код VBScript. Массовая загрузка XML загружает XML-документ в таблицы Ord и Product.

Г. Массовая загрузка в столбцы типа идентификаторов

Этот пример показывает, как массовая загрузка обрабатывает столбцы типа идентификаторов. В этом примере выполняется массовая загрузка данных в три таблицы (Ord, Product и OrderDetail).

В этой таблице:

  • OrderID в таблице Ord является столбцом типа идентификаторов.

  • ProductID в таблице Product является столбцом типа идентификаторов.

  • Столбцы OrderID и ProductID в таблице OrderDetail являются столбцами внешнего ключа, ссылающимися на соответствующие столбцы внешнего ключа в таблицах Ord и Product.

Ниже перечислены схемы таблиц для этого примера:

Ord (OrderID, CustomerID)Product (ProductID, ProductName)OrderDetail (OrderID, ProductID)

В этом примере массовой загрузки XML свойство KeepIdentity модели объектов BulkLoad имеет значение False. Поэтому SQL Server формирует значения идентификаторов для столбцов ProductID и OrderID, соответственно (игнорируются любые значения, предоставленные в документах для массовой загрузки).

В этом случае массовая загрузка XML идентифицирует связь «первичный ключ — внешний ключ» между таблицами. Сначала массовая загрузка вставляет записи в таблицы с первичным ключом, а затем распространяет значения идентификаторов, сформированные SQL Server для таблиц со столбцами первичных ключей. В следующем примере массовая загрузка XML вставляет данные в таблице в следующем порядке:

  1. Товар

  2. Ord

  3. OrderDetail

    ПримечаниеПримечание

    Чтобы распространить значения идентификаторов, сформированные в таблицах Products и Orders, логика обработки требует от массовой загрузки XML отслеживания этих значений для последующей вставки в таблицу OrderDetails. Для этого массовая загрузка XML создает промежуточные таблицы, заполняет эти таблицы данными и впоследствии удаляет их.

Проверка рабочего образца

  1. Создайте следующие таблицы.

    CREATE TABLE Ord (         OrderID     int identity(1,1)  PRIMARY KEY,         CustomerID  varchar(5))GOCREATE TABLE Product (         ProductID   int identity(1,1) PRIMARY KEY,         ProductName varchar(20))GOCREATE TABLE OrderDetail (       OrderID     int FOREIGN KEY REFERENCES Ord(OrderID),       ProductID   int FOREIGN KEY REFERENCES Product(ProductID),                   CONSTRAINT OD_key PRIMARY KEY (OrderID, ProductID))GO
    
  2. В редакторе текста или XML по своему выбору создайте файл и сохраните его под именем SampleSchema.xml. Добавьте в этот файл следующую схему XSD.

    <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="OrderOD"          parent="Ord"          parent-key="OrderID"          child="OrderDetail"          child-key="OrderID" />    <sql:relationship name="ODProduct"          parent="OrderDetail"          parent-key="ProductID"          child="Product"          child-key="ProductID"           inverse="true"/>   </xsd:appinfo> </xsd:annotation>   <xsd:element name="Order" sql:relation="Ord"                             sql:key-fields="OrderID" >   <xsd:complexType>     <xsd:sequence>        <xsd:element name="Product" sql:relation="Product"                      sql:key-fields="ProductID"                     sql:relationship="OrderOD ODProduct">          <xsd:complexType>             <xsd:attribute name="ProductID" type="xsd:int" />             <xsd:attribute name="ProductName" type="xsd:string" />          </xsd:complexType>        </xsd:element>     </xsd:sequence>        <xsd:attribute name="OrderID"   type="xsd:integer" />         <xsd:attribute name="CustomerID"   type="xsd:string" />    </xsd:complexType>  </xsd:element></xsd:schema>
    
  3. В редакторе текста или XML по своему выбору создайте файл и сохраните его под именем SampleXMLData.xml. Добавьте в этот файл следующий XML-документ.

    <ROOT>    <Order OrderID="11" CustomerID="ALFKI">    <Product ProductID="11" ProductName="Chai" />    <Product ProductID="22" ProductName="Chang" />  </Order>  <Order OrderID="22" CustomerID="ANATR">     <Product ProductID="33" ProductName="Aniseed Syrup" />    <Product ProductID="44" ProductName="Gumbo Mix" />  </Order></ROOT>
    
  4. В редакторе текста или XML по своему выбору создайте файл и сохраните его под именем ValidateAndBulkload.vbs. Добавьте в этот файл следующий код VBScript. Измените строку соединения, указав соответствующие имена сервера и базы данных. Укажите соответствующий путь для файлов, которые используются в качестве параметров для метода Execute.

    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.Transaction = FalseobjBL.KeepIdentity = FalseobjBL.Execute "SampleSchema.xml", "SampleXMLData.xml"Set objBL = NothingMsgBox "Done."
    
  5. Выполните код VBScript. Массовая загрузка XML загрузит данные в соответствующие таблицы.

Д. Формирование схем таблиц перед массовой загрузкой

При необходимости массовая загрузка XML может сформировать таблицы, если они не существовали до массовой загрузки. Это достигается присвоением значения TRUE свойству SchemaGen объекта SQLXMLBulkLoad. При необходимости можно запросить у массовой загрузки XML удаление существующих таблиц с их последующим воссозданием путем присвоения значения TRUE свойству SGDropTables. Следующий пример VBScript показывает использование этих свойств.

Кроме того, этот пример назначает значение TRUE двум дополнительным свойствам:

  • CheckConstraints. Присвоение этому свойству значения TRUE гарантирует, что данные, вставляемые в таблицы, не нарушают ограничений, указанных для таблиц (в данном случае ограничений PRIMARY KEY/FOREIGN KEY, указанных между таблицами Cust и CustOrder). При нарушении ограничений массовая загрузка завершается неудачей.

  • XMLFragment. Этому свойству должно быть присвоено значение TRUE, так как образцовый XML-документ (источник данных) не содержит единого элемента верхнего уровня (и таким образом, является фрагментом).

Код VBScript:

Dim objBL 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.XMLFragment = TrueobjBL.SchemaGen = TrueobjBL.SGDropTables = TrueobjBL.Execute "SampleSchema.xml", "SampleXMLData.xml"Set objBL = Nothing

Проверка рабочего образца

  1. В редакторе текста или XML по своему выбору создайте файл и сохраните его под именем SampleSchema.xml. Добавьте в этот файл схему XSD, приведенную в предыдущем примере «Использование цепочечных связей в схеме для массовой загрузки XML».

  2. В редакторе текста или XML по своему выбору создайте файл и сохраните его под именем SampleXMLData.xml. Добавьте в этот файл XML-документ, приведенный в предыдущем примере «Использование цепочечных связей в схеме для массовой загрузки XML». Удалите элемент <ROOT> из документ (превратите его во фрагмент).

  3. В редакторе текста или XML по своему выбору создайте файл и сохраните его под именем ValidateAndBulkload.vbs. Добавьте в этот файл код VBScript в этом примере. Измените строку соединения, указав соответствующие имена сервера и базы данных. Укажите соответствующий путь для файлов, которые заданы в качестве параметров для метода Execute.

  4. Выполните код VBScript. Массовая загрузка XML создает необходимые таблицы на основе предоставленной схемы сопоставления и выполняет массовую загрузку данных в нее.

Е. Массовая загрузка из потока

Метод Execute модели объектов массовой загрузки XML принимает два параметра. Первый параметр — файл схемы сопоставления. Второй параметр предоставляет XML-данные, которые предстоит загрузить в базу данных. Существует два способа передать XML-данные в метод Execute массовой загрузки XML.

  • Указать имя файла в качестве параметра.

  • Передать поток, содержащий XML-данные.

В этом примере показано, как выполнить массовую загрузку данных из потока.

VBScript сначала выполняет инструкцию SELECT, чтобы извлечь данные о заказчике из таблицы Customers в базе данных Northwind. Поскольку в инструкции SELECT указано предложение FOR XML (с параметром ELEMENTS), запрос возвращает XML-документ, в котором используются элементы, в следующей форме:

<Customer>  <CustomerID>..</CustomerID>  <CompanyName>..</CompanyName>  <City>..</City></Customer>...

Затем сценарий передает XML как поток в метод Execute в качестве второго параметра. Метод Execute выполняет массовую загрузку данных в таблицу Cust.

Поскольку этот сценарий присваивает значение TRUE свойству SchemaGen и свойству SGDropTables, массовая загрузка XML создает таблицу Cust в указанной базе данных. (Если таблица уже существует, то она сначала удаляется, а потом создается заново.)

Пример VBScript:

Set objBL = CreateObject("SQLXMLBulkLoad.SQLXMLBulkload.4.0")Set objCmd = CreateObject("ADODB.Command")Set objConn = CreateObject("ADODB.Connection")Set objStrmOut = CreateObject ("ADODB.Stream")objBL.ConnectionString = "provider=SQLOLEDB;data source=localhost;database=tempdb;integrated security=SSPI"objBL.ErrorLogFile     = "c:\error.log"objBL.CheckConstraints = TrueobjBL.SchemaGen        = TrueobjBL.SGDropTables     = TrueobjBL.XMLFragment      = True' Open a connection to the instance of SQL Server to get the source data.objConn.Open "provider=SQLOLEDB;server=(local);database=tempdb;integrated security=SSPI"Set objCmd.ActiveConnection = objConnobjCmd.CommandText = "SELECT CustomerID, CompanyName, City FROM Customers FOR XML AUTO, ELEMENTS"' Open the return stream and execute the command.Const adCRLF = -1Const adExecuteStream = 1024objStrmOut.OpenobjStrmOut.LineSeparator = adCRLFobjCmd.Properties("Output Stream").Value = objStrmOutobjCmd.Execute , , adExecuteStreamobjStrmOut.Position = 0' Execute bulk load. Read source XML data from the stream.objBL.Execute "SampleSchema.xml", objStrmOutSet objBL = Nothing

Следующая схема сопоставления XSD обеспечивает необходимы сведения для создания таблицы:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"            xmlns:sql="urn:schemas-microsoft-com:mapping-schema"><xsd:element name="ROOT" sql:is-constant="true" >  <xsd:complexType>    <xsd:sequence>      <xsd:element ref="Customers"/>    </xsd:sequence>  </xsd:complexType></xsd:element><xsd:element name="Customers" sql:relation="Cust" >  <xsd:complexType>    <xsd:sequence>      <xsd:element name="CustomerID"                   type="xsd:string"                   sql:datatype="nvarchar(5)"/>      <xsd:element name="CompanyName"                   type="xsd:string"                   sql:datatype="nvarchar(40)"/>      <xsd:element name="City"                   type="xsd:string"                   sql:datatype="nvarchar(40)"/>    </xsd:sequence>  </xsd:complexType></xsd:element></xsd:schema>

Эквивалентная схема 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" dt:type="int" />   <ElementType name="CompanyName" dt:type="string" />   <ElementType name="City" dt:type="string" />   <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" />    </ElementType></Schema>

Открытие потока на существующем файле

Можно также открыть поток на существующем файле XML-данных и передать поток как параметр методу Execute (вместо передачи имени файла в качестве параметра).

Пример Visual Basic передачи потока как параметра:

Private Sub Form_Load()Dim objBL As New SQLXMLBulkLoadDim objStrm As New ADODB.StreamDim objFileSystem As New Scripting.FileSystemObjectDim objFile As Scripting.TextStreamMsgBox "Begin BulkLoad..."objBL.ConnectionString = "provider=SQLOLEDB;data source=localhost;database=tempdb;integrated security=SSPI"objBL.ErrorLogFile = "c:\error.log"objBL.CheckConstraints = TrueobjBL.SchemaGen = TrueobjBL.SGDropTables = True' Here again a stream is specified that contains the source data ' (instead of the file name). But this is just an illustration.' Usually this is useful if you have an XML data ' stream that is created by some other means that you want to bulk ' load. This example starts with an XML text file, so it may not be the ' best to use a stream (you can specify the file name directly).' Here you could have specified the file name itself. Set objFile = objFileSystem.OpenTextFile("c:\SampleData.xml")objStrm.OpenobjStrm.WriteText objFile.ReadAllobjStrm.Position = 0objBL.Execute "c:\SampleSchema.xml", objStrmSet objBL = NothingMsgBox "Done."End Sub

Чтобы протестировать приложение, используйте XML-документ в файле (SampleData.xml) и XSD-схему, приведенную в этом примере:

Источник XML-данных (SampleData.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 CustomerID= "4444" OrderID="4" /></Customers></ROOT>

Эквивалентная схема 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="Order" sql:relation="CustOrder" >      <AttributeType name="OrderID" />      <AttributeType name="CustomerID" />      <attribute type="OrderID" />      <attribute type="CustomerID" />    </ElementType>   <ElementType name="CustomerID" dt:type="int" />   <ElementType name="CompanyName" dt:type="string" />   <ElementType name="City" dt:type="string" />   <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></Schema>

Ж. Массовая загрузка в столбцы переполнения

Если схема сопоставления задает столбец переполнения с использованием заметки sql:overflow-field, массовая загрузка XML копирует все невостребованные данные из исходного документа в этом столбце.

Рассмотрим следующую схему XSD:

<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"                                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" >         <xsd:complexType>          <xsd:attribute name="OrderID" type="xsd:integer" />          <xsd:attribute name="CustomerID" type="xsd:integer" />         </xsd:complexType>       </xsd:element>     </xsd:sequence>    </xsd:complexType>  </xsd:element></xsd:schema>

Схема определяет столбец переполнения (OverflowColumn) для таблицы Cust. В результате невостребованные XML-данные для каждого элемента <Customer> добавляются в этот столбец.

ПримечаниеПримечание

Все абстрактные элементы (элементы, для которых заданы abstract="true") и все запрещенные атрибуты (атрибуты, для которых заданы prohibited="true") рассматриваются как переполнение массовой загрузкой XML и добавляются в столбец переполнения, если они указаны. (В противном случае они пропускаются.)

Проверка рабочего образца

  1. В базе данных tempdb создайте две таблицы:

    USE tempdbCREATE 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))GO
    
  2. В редакторе текста или XML по своему выбору создайте файл и сохраните его под именем SampleSchema.xml. Добавьте в этот файл схему XSD, приведенную в данном примере.

  3. В редакторе текста или XML по своему выбору создайте файл и сохраните его под именем SampleXMLData.xml. Добавьте в этот файл следующий 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>     <![CDATA[LA]]>     <!-- <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>
    
  4. В редакторе текста или XML по своему выбору создайте файл и сохраните его под именем ValidateAndBulkload.vbs. Добавьте в этот файл следующий код Microsoft Visual Basic Scripting Edition (VBScript). Измените строку соединения, указав соответствующие имена сервера и базы данных. Укажите соответствующий путь для файлов, которые заданы в качестве параметров для метода Execute.

    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 "SampleSchema.xml", "SampleXMLData.xml"set objBL=Nothing
    
  5. Выполните код VBScript.

Эквивалентная схема 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="Order" sql:relation="CustOrder" >      <AttributeType name="OrderID" />      <AttributeType name="CustomerID" />      <attribute type="OrderID" />      <attribute type="CustomerID" />    </ElementType>   <ElementType name="CustomerID" dt:type="int" />   <ElementType name="CompanyName" dt:type="string" />   <ElementType name="City" dt:type="string" />   <ElementType name="root" sql:is-constant="1">      <element type="Customers" />   </ElementType>   <ElementType name="Customers" sql:relation="Cust"                        sql:overflow-field="OverflowColumn"  >      <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></Schema>

З. Задание пути к файлу для временных файлов в режиме транзакции

При выполнении массовой загрузки в режиме транзакции (то есть, если свойству Transaction присвоено значение TRUE), можно также установить свойство TempFilePath при выполнении одного из перечисленных ниже условий:

  • Выполняется массовая загрузка на удаленный сервер.

  • Нужно использовать другой локальный диск или папку (отличный от пути, указанного переменной среды TEMP) для хранения временных файлов, созданных в режиме транзакции.

Например, следующий код VBScript выполняет массовую загрузку данных из файла SampleXMLData.xml в таблицы базы данных в режиме транзакции. Свойство TempFilePath указывается, чтобы установить путь для временных файлов, созданных в режиме транзакции.

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.Transaction=TrueobjBL.TempFilePath="\\Server\MyDir"objBL.Execute "SampleSchema.xml", "SampleXMLData.xml"set objBL=Nothing
ПримечаниеПримечание

Путь к временному файлу должен быть общедоступным местом, обратиться к которому можно из учетной записи службы целевого экземпляра SQL Server и учетной записи, которая запускает приложение массовой загрузки. Если не выполняется массовая загрузка на локальный сервер, временный путь к файлу должен быть представлен в формате UNC (таком как \\servername\sharename).

Проверка рабочего образца

  1. Создайте следующую таблицу в базе данных tempdb:

    USE tempdbCREATE TABLE Cust (     CustomerID uniqueidentifier,       LastName  varchar(20))GO
    
  2. В редакторе текста или XML по своему выбору создайте файл и сохраните его под именем SampleSchema.xml. Добавьте в этот файл следующую схему XSD:

    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"            xmlns:sql="urn:schemas-microsoft-com:mapping-schema">  <xsd:element name="ROOT" sql:is-constant="true" >    <xsd:complexType>      <xsd:sequence>        <xsd:element ref="Customers" />      </xsd:sequence>    </xsd:complexType>  </xsd:element>  <xsd:element name="Customers" sql:relation="Cust" >   <xsd:complexType>     <xsd:attribute name="CustomerID"  type="xsd:string" />     <xsd:attribute name="LastName" type="xsd:string" />   </xsd:complexType>  </xsd:element></xsd:schema>
    
  3. В редакторе текста или XML по своему выбору создайте файл и сохраните его под именем SampleXMLData.xml. Добавьте в этот файл следующий XML-документ:

    <ROOT><Customers CustomerID="6F9619FF-8B86-D011-B42D-00C04FC964FF"            LastName="Smith" /></ROOT>
    
  4. В редакторе текста или XML по своему выбору создайте файл и сохраните его под именем ValidateAndBulkload.vbs. Добавьте в этот файл следующий код VBScript. Измените строку соединения, указав соответствующие имена сервера и базы данных. Укажите соответствующий путь для файлов, которые заданы в качестве параметров для метода Execute. Также укажите подходящий путь для свойства TempFilePath.

    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.Transaction=TrueobjBL.TempFilePath="\\server\folder"objBL.Execute "SampleSchema.xml", "SampleXMLData.xml"set objBL=Nothing
    
  5. Выполните код VBScript.

    Схема должна указывать соответствующий sql:datatype для атрибута CustomerID, когда значение CustomerID задано как идентификатор GUID, включающий фигурные скобки ({ и }), как показано ниже:

    <ROOT><Customers CustomerID="{6F9619FF-8B86-D011-B42D-00C04FC964FF}"            LastName="Smith" /></ROOT>
    

    Обновленная схема:

    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"            xmlns:sql="urn:schemas-microsoft-com:mapping-schema">  <xsd:element name="ROOT" sql:is-constant="true" >    <xsd:complexType>      <xsd:sequence>        <xsd:element ref="Customers" />      </xsd:sequence>    </xsd:complexType>  </xsd:element>  <xsd:element name="Customers" sql:relation="Cust" >   <xsd:complexType>     <xsd:attribute name="CustomerID"  type="xsd:string"                     sql:datatype="uniqueidentifier" />     <xsd:attribute name="LastName" type="xsd:string" />   </xsd:complexType>  </xsd:element></xsd:schema>
    

    Когда указан sql:datatype, определяющий тип столбца как uniqueidentifier, операция массовой загрузки удаляет фигурные скобки ({ и }) из значения CustomerID перед его вставкой в столбец.

Эквивалентная схема XDR:

<?xml version="1.0" ?><Schema xmlns="urn:schemas-microsoft-com:xml-data"         xmlns:dt="urn:schemas-microsoft-com:datatypes"          xmlns:sql="urn:schemas-microsoft-com:xml-sql" ><ElementType name="ROOT" sql:is-constant="1">      <element type="Customers" /></ElementType><ElementType name="Customers" sql:relation="Cust" >  <AttributeType name="CustomerID"  sql:datatype="uniqueidentifier" />  <AttributeType name="LastName"   />  <attribute type="CustomerID" />  <attribute type="LastName"   /></ElementType></Schema>

И. Использование существующего соединения базы данных со свойством ConnectionCommand

Для массовой загрузки XML можно использовать существующее соединение ADO. Это полезно, если массовая загрузка XML — лишь одна из многих операций, которые выполняются над источником данных.

Свойство ConnectionCommand позволяет использовать существующее соединение ADO с использованием объекта команды ADO. Это продемонстрировано в следующем примере Visual Basic:

Private Sub Form_Load()Dim objBL As New SQLXMLBulkLoad4Dim objCmd As New ADODB.CommandDim objConn As New ADODB.Connection'Open a connection to an instance of SQL Server.objConn.Open "provider=SQLOLEDB;data source=(local);database=tempdb;integrated security=SSPI"'Ask the Command object to use the connection just established.Set objCmd.ActiveConnection = objConn'Tell Bulk Load to use the active command object that is using the Connection obj.objBL.ConnectionCommand = objCmdobjBL.ErrorLogFile = "c:\error.log"objBL.CheckConstraints = True'The Transaction property must be set to True if you use ConnectionCommand.objBL.Transaction = TrueobjBL.Execute "SampleSchema.xml", "SampleXMLData.xml"Set objBL = NothingEnd Sub

Проверка рабочего образца

  1. В базе данных tempdb создайте две таблицы:

    USE tempdbCREATE TABLE Cust(               CustomerID   varchar(5) PRIMARY KEY,               CompanyName  varchar(30),               City         varchar(20))GOCREATE TABLE CustOrder(               CustomerID  varchar(5) references Cust (CustomerID),               OrderID     varchar(5) PRIMARY KEY)GO
    
  2. В редакторе текста или XML по своему выбору создайте файл и сохраните его под именем SampleSchema.xml. Добавьте в этот файл следующую схему XSD:

    <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="true" >    <xsd:complexType>      <xsd:sequence>        <xsd:element ref="Customers" />      </xsd:sequence>    </xsd:complexType>  </xsd:element>  <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:attribute name="CustomerID" type="xsd:integer" />         </xsd:complexType>       </xsd:element>     </xsd:sequence>    </xsd:complexType>  </xsd:element></xsd:schema>
    
  3. В редакторе текста или XML по своему выбору создайте файл и сохраните его под именем SampleXMLData.xml. Добавьте в этот файл следующий 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>
    
  4. Создайте приложение Visual Basic (стандартное EXE) приложение и предшествующий код. Добавьте эти ссылки в проект:

    Microsoft XML BulkLoad for SQL Server 4.0 Type LibraryMicrosoft ActiveX Data objects 2.6 Library
    
  5. Запустите приложение.

Эквивалентная схема 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" dt:type="int" />   <ElementType name="CompanyName" dt:type="string" />   <ElementType name="City" dt:type="string" />   <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>

К. Массовая загрузка в столбцах типа данных xml

Если схема сопоставления задает столбец типа данных xml с использованием заметки sql:datatype="xml", массовая загрузка XML может копировать дочерние элементы XML сопоставленного поля из исходного документа в этом столбце.

Примите во внимание следующую XSD-схему, которая сопоставляет представление таблицы Production.ProductModel в образце в базе данных AdventureWorks. В этой таблице, поле CatalogDescription типа данных xml сопоставляется элементу <Desc> с использованием заметок sql:field и sql:datatype="xml".

<?xml version="1.0" encoding="utf-8" ?><xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"            xmlns:sql="urn:schemas-microsoft-com:mapping-schema"           xmlns="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription">   <xsd:element name="ProductModel"  sql:relation="Production.ProductModel" >    <xsd:complexType>      <xsd:sequence>        <xsd:element name="Name" type="xs:string"></xsd:element>        <xsd:element name="Desc" sql:field="CatalogDescription" sql:datatype="xml">        <xsd:complexType>          <xsd:sequence>            <xsd:element name="ProductDescription">              <xsd:complexType>                <xsd:sequence>                  <xsd:element name="Summary" type="xs:anyType"/>                </xsd:sequence>              </xsd:complexType>            </xsd:element>          </xsd:sequence>        </xsd:complexType>        </xsd:element>      </xsd:sequence>     <xsd:attribute name="ProductModelID" sql:field="ProductModelID" />    </xsd:complexType>  </xsd:element></xsd:schema>

Проверка рабочего образца

  1. Проверьте, что образец базы данных AdventureWorks установлен.

    Дополнительные сведения см. в разделе Образцы баз данных AdventureWorks.

  2. В редакторе текста или XML по своему выбору создайте файл и сохраните его под именем SampleSchema.xml. Скопируйте приведенную выше схему XSD, вставьте ее в файл и сохраните его.

  3. В редакторе текста или XML по своему выбору создайте файл и сохраните его под именем SampleXMLData.xml. Скопируйте следующий XML-документ, вставьте его в файл и сохраните его в той же папке, которая была использована на предыдущем шаге.

    <ProductModel ProductModelID="2005">    <Name>Mountain-100 (2005 model)</Name>    <Desc><?xml-stylesheet href="ProductDescription.xsl" type="text/xsl"?>        <p1:ProductDescription xmlns:p1="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription"               xmlns:wm="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain"               xmlns:wf="https://www.adventure-works.com/schemas/OtherFeatures"               xmlns:html="http://www.w3.org/1999/xhtml"               >            <p1:Summary>                <html:p>Our top-of-the-line competition mountain bike.       Performance-enhancing options include the innovative HL Frame,       super-smooth front suspension, and traction for all terrain.                        </html:p>            </p1:Summary>            <p1:Manufacturer>                <p1:Name>AdventureWorks</p1:Name>                <p1:Copyright>2002-2005</p1:Copyright>                <p1:ProductURL>HTTP://www.Adventure-works.com</p1:ProductURL>            </p1:Manufacturer>            <p1:Features>These are the product highlights.                  <wm:Warranty>                    <wm:WarrantyPeriod>3 years</wm:WarrantyPeriod>                    <wm:Description>parts and labor</wm:Description>                </wm:Warranty><wm:Maintenance>                    <wm:NoOfYears>10 years</wm:NoOfYears>                    <wm:Description>maintenance contract available through your dealer or any AdventureWorks retail store.</wm:Description>                </wm:Maintenance><wf:wheel>High performance wheels.</wf:wheel><wf:saddle>                    <html:i>Anatomic design</html:i> and made from durable leather for a full-day of riding in comfort.</wf:saddle><wf:pedal>                    <html:b>Top-of-the-line</html:b> clipless pedals with adjustable tension.</wf:pedal><wf:BikeFrame>Each frame is hand-crafted in our Bothell facility to the optimum diameter       and wall-thickness required of a premium mountain frame.       The heat-treated welded aluminum frame has a larger diameter tube that absorbs the bumps.</wf:BikeFrame><wf:crankset> Triple crankset; alumunim crank arm; flawless shifting. </wf:crankset></p1:Features>            <!-- add one or more of these elements... one for each specific product in this product model -->            <p1:Picture>                <p1:Angle>front</p1:Angle>                <p1:Size>small</p1:Size>                <p1:ProductPhotoID>118</p1:ProductPhotoID>            </p1:Picture>            <!-- add any tags in <specifications> -->            <p1:Specifications> These are the product specifications.                   <Material>Almuminum Alloy</Material><Color>Available in most colors</Color><ProductLine>Mountain bike</ProductLine><Style>Unisex</Style><RiderExperience>Advanced to Professional riders</RiderExperience></p1:Specifications>        </p1:ProductDescription>    </Desc></ProductModel>
    
  4. В редакторе текста или XML по своему выбору создайте файл и сохраните его под именем BulkloadXml.xml. Скопируйте следующий код VBScript и вставьте его в файл. Сохраните в той же папке, которая была использована для предыдущих файлов XML-данных и схемы.

    set objBL = CreateObject("SQLXMLBulkLoad.SQLXMLBulkload.4.0")objBL.ConnectionString = "provider=SQLOLEDB;data source=MyServer;database=AdventureWorks;integrated security=SSPI"Dim fso, sAppPathSet fso = CreateObject("Scripting.FileSystemObject") sAppPath = fso.GetFolder(".") objBL.ErrorLogFile = sAppPath & "\error.log"'Execute XML bulkload using file.objBL.Execute "SampleSchema.xml", "SampleXMLData.xml"set objBL=Nothing
    
  5. Выполните сценарий BulkloadXml.vbs.