Примеры массового импорта и экспорта XML-документов (SQL Server)Examples of bulk import and export of XML documents (SQL Server)

Применимо к:Applies to: даSQL Server 2016 (13.x);SQL Server 2016 (13.x)yesSQL Server 2016 (13.x);SQL Server 2016 (13.x) и более поздние версии ДаБаза данных SQL AzureAzure SQL DatabaseYesБаза данных SQL AzureAzure SQL Database ДаУправляемый экземпляр SQL AzureAzure SQL Managed InstanceYesУправляемый экземпляр SQL AzureAzure SQL Managed InstanceПрименимо к:Applies to: даSQL Server 2016 (13.x);SQL Server 2016 (13.x)yesSQL Server 2016 (13.x);SQL Server 2016 (13.x) and later ДаБаза данных SQL AzureAzure SQL DatabaseYesБаза данных SQL AzureAzure SQL Database ДаУправляемый экземпляр SQL AzureAzure SQL Managed InstanceYesУправляемый экземпляр SQL AzureAzure SQL Managed Instance

Можно выполнить массовый импорт XML-документов в базу данных SQL ServerSQL Server или осуществить массовый экспорт XML-документов из базы данных SQL ServerSQL Server.You can bulk import XML documents into a SQL ServerSQL Server database or bulk export them from a SQL ServerSQL Server database. В этом разделе приведены примеры и того, и другого.This topic provides examples of both.

Для выполнения массового импорта данных из файла в таблицу SQL ServerSQL Server или несекционированное представление могут использоваться следующие средства.To bulk import data from a data file into a SQL ServerSQL Server table or non-partitioned view, you can use the following:

  • Программаbcpbcp utility
    Программа bcp может выполнять экспорт везде в базе данных SQL ServerSQL Server , где работает инструкция SELECT, включая секционированные представления.You can also use the bcp utility to export data from anywhere in a SQL ServerSQL Server database that a SELECT statement works, including partitioned views.

  • BULK INSERTBULK INSERT

  • Инструкции INSERT ... SELECT * FROM OPENROWSET(BULK...).INSERT ... SELECT * FROM OPENROWSET(BULK...)

Дополнительные сведения см. в следующих разделах:For more information, see the following topics.

ПримерыExamples

Далее следуют примеры.The examples are the following:

Массовый импорт XML-данных в виде двоичного байтового потокаBulk importing XML data as a binary byte stream

При массовом импорте XML-данных из файла, содержащего объявление кодировки, которое необходимо применить, нужно указать параметр SINGLE_BLOB в предложении OPENROWSET(BULK…).When you bulk import XML data from a file that contains an encoding declaration that you want to apply, specify the SINGLE_BLOB option in the OPENROWSET(BULK...) clause. Параметр SINGLE_BLOB гарантирует, что средство синтаксического анализа XML в SQL ServerSQL Server произведет импорт данных в соответствии со схемой кодирования, указанной в XML-объявлении.The SINGLE_BLOB option ensures that the XML parser in SQL ServerSQL Server imports the data according to the encoding scheme specified in the XML declaration.

Образец таблицыSample Table

Для проверки представленного ниже примера A необходимо создать образец таблицы T.To test example A below, create sample table T.

USE tempdb  
CREATE TABLE T (IntCol int, XmlCol xml);  
GO  

Образец файла данныхSample Data File

Перед запуском примера А необходимо создать файл в кодировке UTF-8 (C:\SampleFolder\SampleData3.txt), содержащий следующий образец, который определяет схему в кодировке UTF-8 .Before you can run example A, you must create a UTF-8 encoded file (C:\SampleFolder\SampleData3.txt) that contains the following sample instance that specifies the UTF-8 encoding scheme.

<?xml version="1.0" encoding="UTF-8"?>  
<Root>  
          <ProductDescription ProductModelID="5">  
             <Summary>Some Text</Summary>  
          </ProductDescription>  
</Root>  

Пример AExample A

В этом примере используется параметр SINGLE_BLOB в инструкции INSERT ... SELECT * FROM OPENROWSET(BULK...) для импорта данных из файла с именем SampleData3.txt и вставки экземпляра данных XML в таблицу с одним столбцом, образец таблицы T.This example uses the SINGLE_BLOB option in an INSERT ... SELECT * FROM OPENROWSET(BULK...) statement to import data from a file named SampleData3.txt and insert an XML instance in the single-column table, sample table T.

INSERT INTO T(XmlCol)  
SELECT * FROM OPENROWSET(  
   BULK 'c:\SampleFolder\SampleData3.txt',  
   SINGLE_BLOB) AS x;  

RemarksRemarks

С помощью параметра SINGLE_BLOB можно избежать несоответствия между кодировкой XML-документа (указанной в объявлении кодировки XML) и кодовой страницей строки, используемой сервером.By using SINGLE_BLOB in this case, you can avoid a mismatch between the encoding of the XML document (as specified by the XML encoding declaration) and the string codepage implied by the server.

Если при использовании типов данных NCLOB или CLOB возникает конфликт кодовой страницы или кодировки, необходимо выполнить одно из следующих действий.If you use NCLOB or CLOB data types and run into a codepage or encoding conflict, you must do one of the following:

  • Удалить XML-декларацию, чтобы успешно импортировать содержимое XML-файла данных.Remove the XML declaration to successfully import the contents of the XML data file.

  • Указать кодовую страницу в параметре CODEPAGE запроса, который соответствует схеме кодирования, используемой в XML-декларации.Specify a code page in the CODEPAGE option of the query that matches the encoding scheme that is used in the XML declaration.

  • Подобрать настройки параметров сортировки баз данных для схемы кодирования XML-данных, отличной от кодировки Юникод.Match, or resolve, the database collation settings with a non-Unicode XML encoding scheme.

[В начало][Top]

Массовый импорт XML-данных в существующую строкуBulk importing XML data in an existing row

В этом примере при помощи поставщика массового набора строк OPENROWSET в существующую строку или строки образца таблицы Tдобавляются инструкции XML.This example uses the OPENROWSET bulk rowset provider to add an XML instance to an existing row or rows in sample table T.

Примечание

Чтобы выполнить этот пример, вначале необходимо выполнить скрипт проверки в примере А. В этом примере сначала создается таблица tempdb.dbo.T ; затем в нее проводится массовый импорт данных из файла SampleData3.txt.To run this example, you must first complete the test script provided in example A. That example creates the tempdb.dbo.T table and bulk imports data from SampleData3.txt.

Образец файла данныхSample Data File

В примере Б используется измененная версия образца файла данных SampleData3.txt из предыдущего примера.Example B uses a modified version of the SampleData3.txt sample data file from the preceding example. Для запуска этого примера нужно изменить содержимое этого файла следующим образом:To run this example, modify the content of this file as follows:

<Root>  
          <ProductDescription ProductModelID="10">  
             <Summary>Some New Text</Summary>  
          </ProductDescription>  
</Root>  

Пример БExample B

-- Query before update shows initial state of XmlCol values.  
SELECT * FROM T  
UPDATE T  
SET XmlCol =(  
SELECT * FROM OPENROWSET(  
   BULK 'C:\SampleFolder\SampleData3.txt',  
           SINGLE_BLOB  
) AS x  
)  
WHERE IntCol = 1;  
GO  

[В начало][Top]

Массовый импорт XML-данных из файла, содержащего DTDBulk importing XML data from a file that contains a DTD

Важно!

Включать поддержку для определений типов документов (DTD) не рекомендуется, если только это не является неотъемлемой частью среды XML.We recommended that you not enable support for Document Type Definitions (DTDs) if it is not required in your XML environment. Включение поддержки DTD увеличивает уязвимую контактную зону сервера и может привести к атаке типа «отказ в обслуживании».Turning on DTD support increases the attackable surface area of your server, and may expose it to a denial-of-service attack. При необходимости включения поддержки DTD снизить риск для этой опасности можно с помощью обработки только доверенных XML-документов.If you must enable DTD support, you can reduce this security risk by processing only trusted XML documents.

При попытке использования команды bcp для импорта XML-данных из файла, содержащего DTD, может возникнуть одна из следующих ошибок:During an attempt to use a bcp command to import XML data from a file that contains a DTD, an error similar to the following can occur:

SQLState = 42000, NativeError = 6359"SQLState = 42000, NativeError = 6359"

«Error = [Microsoft][SQL Server Native Client][ SQL Server]Разбор XML при помощи встроенного DTD не допускается."Error = [Microsoft][SQL Server Native Client][ SQL Server]Parsing XML with internal subset DTDs not allowed. Используйте CONVERT с параметром стиля 2 для включения ограниченной поддержки встроенного DTD.»Use CONVERT with style option 2 to enable limited internal subset DTD support."

«Не удалось выполнить BCP-копирование %s»"BCP copy %s failed"

Чтобы избежать этой проблемы, можно импортировать XML-данные из файла, содержащего DTD, при помощи функции OPENROWSET(BULK...) , а затем указать параметр CONVERT в предложении SELECT .To work around this problem, you can import XML data from a data file that contains a DTD by using the OPENROWSET(BULK...) function and then specifying the CONVERT option in the SELECT clause of the command. Базовым синтаксисом команды является:The basic syntax for the command is:

INSERT ... SELECT CONVERT(...) FROM OPENROWSET(BULK...)

Образец файла данныхSample Data File

Перед проверкой этого примера массового импорта создайте файл (C:\temp\Dtdfile.xml), содержащий следующий образец данных:Before you can test this bulk import example, create a file (C:\temp\Dtdfile.xml) that contains the following sample instance:

<!DOCTYPE DOC [<!ATTLIST elem1 attr1 CDATA "defVal1">]><elem1>January</elem1>  

Образец таблицыSample Table

В примере В используется образец таблицы T1 , созданный следующей инструкцией CREATE TABLE :Example C uses the T1 sample table that is created by the following CREATE TABLE statement:

USE tempdb;  
CREATE TABLE T1(XmlCol xml);  
GO  

Пример ВExample C

В этом примере используется OPENROWSET(BULK...) и в предложении CONVERT указывается параметр SELECT для импорта XML-данных из Dtdfile.xml в образец таблицы T1.This example uses OPENROWSET(BULK...) and specifies the CONVERT option in the SELECT clause to import the XML data from Dtdfile.xml into sample table T1.

INSERT T1  
  SELECT CONVERT(xml, BulkColumn, 2) FROM   
    OPENROWSET(Bulk 'c:\temp\Dtdfile.xml', SINGLE_BLOB) [rowsetresults];  

После выполнения инструкции INSERT определение DTD исключается из XML и хранится в таблице T1 .After the INSERT statement executes, the DTD is stripped from the XML and stored in the T1 table.

[В начало][Top]

Указание признаков конца поля явным образом при помощи файла форматированияSpecifying the field terminator explicitly using a format file

В следующем примере демонстрируется, как выполнить массовый импорт XML-документа Xmltable.dat.The following example shows how to bulk import the following XML document, Xmltable.dat.

Образец файла данныхSample Data File

Документ из Xmltable.dat содержит два значения XML, по одному в каждой строке.The document in Xmltable.dat contains two XML values, one for each row. Первое значение XML имеет кодировку UTF-16, второе — UTF-8.The first XML value is encoded with UTF-16, and the second value is encoded with UTF-8.

Содержимое этого файла данных показано в следующем шестнадцатеричном дампе:The contents of this data file are shown in the following Hex dump:

FF FE 3C 00 3F 00 78 00-6D 00 6C 00 20 00 76 00  *..\<.?.x.m.l. .v.*  
65 00 72 00 73 00 69 00-6F 00 6E 00 3D 00 22 00  *e.r.s.i.o.n.=.".*  
31 00 2E 00 30 00 22 00-20 00 65 00 6E 00 63 00  *1...0.". .e.n.c.*  
6F 00 64 00 69 00 6E 00-67 00 3D 00 22 00 75 00  *o.d.i.n.g.=.".u.*  
74 00 66 00 2D 00 31 00-36 00 22 00 3F 00 3E 00  *t.f.-.1.6.".?.>.*  
3C 00 72 00 6F 00 6F 00-74 00 3E 00 A2 4F 9C 76  *\<.r.o.o.t.>..O.v*  
0C FA 77 E4 80 00 89 00-00 06 90 06 91 2E 9B 2E  *..w.............*  
99 34 A2 34 86 00 83 02-92 20 7F 02 4E C5 E4 A3  *.4.4..... ..N...*  
34 B2 B7 B3 B7 FE F8 FF-F8 00 3C 00 2F 00 72 00  *4.........\<./.r.*  
6F 00 6F 00 74 00 3E 00-00 00 00 00 7A EF BB BF  *o.o.t.>.....z...*  
3C 3F 78 6D 6C 20 76 65-72 73 69 6F 6E 3D 22 31  *\<?xml version="1*  
2E 30 22 20 65 6E 63 6F-64 69 6E 67 3D 22 75 74  *.0" encoding="ut*  
66 2D 38 22 3F 3E 3C 72-6F 6F 74 3E E4 BE A2 E7  *f-8"?><root>....*  
9A 9C EF A8 8C EE 91 B7-C2 80 C2 89 D8 80 DA 90  *................*  
E2 BA 91 E2 BA 9B E3 92-99 E3 92 A2 C2 86 CA 83  *................*  
E2 82 92 C9 BF EC 95 8E-EA 8F A4 EB 88 B4 EB 8E  *................*  
B7 EF BA B7 EF BF B8 C3-B8 3C 2F 72 6F 6F 74 3E  *.........</root>*  
00 00 00 00 7A                                   *....z*  

Образец таблицыSample Table

При выполнении массового импорта или экспорта XML-документа следует использовать признаки конца поля , которые не могут присутствовать в каком-либо документе, например последовательность из четырех значений NULL (\0), заканчивающаяся буквой z: \0\0\0\0z.When you bulk import or export an XML document, you should use a field terminator that cannot possibly appear in any of the documents; for example, a series of four nulls (\0) followed by the letter z: \0\0\0\0z.

В этом примере показано, как использовать эти признаки конца поля в образце таблицы xTable .This example shows how to use this field terminator for the xTable sample table. Чтобы создать этот образец таблицы, используйте следующую инструкцию CREATE TABLE :To create this sample table, use the following CREATE TABLE statement:

USE tempdb;  
CREATE TABLE xTable (xCol xml);  
GO  

Образец файла форматированияSample Format File

Признак конца поля должен быть указан в файле форматирования.The field terminator must be specified in the format file. В примере Г создается файл форматирования Xmltable.fmt в формате, отличном от XML, который содержит следующее:Example D uses a non-XML format file named Xmltable.fmt that contains the following:

9.0  
1  
1       SQLBINARY     0       0       "\0\0\0\0z"    1     xCol         ""  

Этот файл форматирования можно использовать для массового импорта XML-документов в таблицу xTable при помощи команды bcp или инструкции BULK INSERT или INSERT ... SELECT * FROM OPENROWSET(BULK...) .You can use this format file to bulk import XML documents into the xTable table by using a bcp command or a BULK INSERT or INSERT ... SELECT * FROM OPENROWSET(BULK...) statement.

Пример ГExample D

В этом примере используется файл форматирования Xmltable.fmt в инструкции BULK INSERT для импорта содержимого файла XML-данных с именем Xmltable.dat.This example uses the Xmltable.fmt format file in a BULK INSERT statement to import the contents of an XML data file named Xmltable.dat.

BULK INSERT xTable   
FROM 'C:\Xmltable.dat'  
WITH (FORMATFILE = 'C:\Xmltable.fmt');  
GO  

[В начало][Top]

Массовый экспорт XML-данныхBulk exporting XML data

В следующем примере для выполнения массового экспорта XML-данных из таблицы, созданной в предыдущем примере при помощи того же XML-файла форматирования, используется программа bcp.The following example uses bcp to bulk export XML data from the table that is created in the preceding example by using the same XML format file. В следующей команде bcp``<server_name> и <instance_name> являются заполнителями, которые должны быть заменены соответствующими значениями:In the following bcp command, <server_name> and <instance_name> represent placeholders that must be replaced with appropriate values:

bcp bulktest..xTable out a-wn.out -N -T -S<server_name>\<instance_name>  

Примечание

SQL ServerSQL Server не сохраняет кодировку XML, если XML-данные постоянно хранятся в базе данных.does not save the XML encoding when XML data is persisted in the database. Поэтому оригинальная кодировка полей XML недоступна при экспорте XML-данных.Therefore, the original encoding of XML fields is not available when XML data is exported. SQL ServerSQL Server использует для экспорта XML-данных кодировку UTF-16.uses UTF-16 encoding when exporting XML data.

См. также:See Also

INSERT (Transact-SQL) INSERT (Transact-SQL)
Предложение SELECT (Transact-SQL) SELECT Clause (Transact-SQL)
bcp Utility bcp Utility
Массовый импорт и экспорт данных (SQL Server) Bulk Import and Export of Data (SQL Server)
BULK INSERT (Transact-SQL) BULK INSERT (Transact-SQL)
OPENROWSET (Transact-SQL)OPENROWSET (Transact-SQL)