BULK INSERT (Transact-SQL)

Tsql теория > BULK INSERT (Transact-SQL)
18.04.2018 15:24:50



Статья:

BULK INSERT   
   [ database_name . [ schema_name ] . | schema_name . ] [ table_name | view_name ]   
      FROM ''data_file''   
     [ WITH   
    (   
   [ [ , ] BATCHSIZE = batch_size ]   
   [ [ , ] CHECK_CONSTRAINTS ]   
   [ [ , ] CODEPAGE = { ''ACP'' | ''OEM'' | ''RAW'' | ''code_page'' } ]   
   [ [ , ] DATAFILETYPE =   
      { ''char'' | ''native''| ''widechar'' | ''widenative'' } ]   
   [ [ , ] DATASOURCE = ''data_source_name'' ]
   [ [ , ] ERRORFILE = ''file_name'' ]
   [ [ , ] ERRORFILE_DATASOURCE = ''data_source_name'' ]   
   [ [ , ] FIRSTROW = first_row ]   
   [ [ , ] FIRE_TRIGGERS ]   
   [ [ , ] FORMATFILE_DATASOURCE = ''data_source_name'' ]
   [ [ , ] KEEPIDENTITY ]   
   [ [ , ] KEEPNULLS ]   
   [ [ , ] KILOBYTES_PER_BATCH = kilobytes_per_batch ]   
   [ [ , ] LASTROW = last_row ]   
   [ [ , ] MAXERRORS = max_errors ]   
   [ [ , ] ORDER ( { column [ ASC | DESC ] } [ ,...n ] ) ]   
   [ [ , ] ROWS_PER_BATCH = rows_per_batch ]   
   [ [ , ] ROWTERMINATOR = ''row_terminator'' ]   
   [ [ , ] TABLOCK ]   

   -- input file format options
   [ [ , ] FORMAT = ''CSV'' ]
   [ [ , ] FIELDQUOTE = ''quote_characters'']
   [ [ , ] FORMATFILE = ''format_file_path'' ]   
   [ [ , ] FIELDTERMINATOR = ''field_terminator'' ]   
   [ [ , ] ROWTERMINATOR = ''row_terminator'' ]   
    )]   

Аргументы

database_name
Имя базы данных, в которой находится указанная таблица или представление. Если не указано, предполагается текущая база данных.

schema_name
Имя схемы таблицы или представления. Указание аргумента schema_name необязательно, если схемой по умолчанию для пользователя, выполняющего операцию массового импорта, является схема указанной таблицы или представления. Если аргумент schema не указан и схема по умолчанию для пользователя, выполняющего операцию массового импорта, отличается от схемы таблицы или представления, SQL Server возвращает сообщение об ошибке и операция массового импорта не выполняется.

имя_таблицы
Имя таблицы или представления, куда производится массовый импорт данных. Могут указываться только те представления, в которых все столбцы относятся к одной и той же базовой таблице. Дополнительные сведения об ограничениях, накладываемых на загрузку данных в представления, см. в разделе INSERT (Transact-SQL).

'' data_file ''
Полный путь и имя файла данных, который содержит импортируемые в указанную таблицу или представление данные. Инструкция BULK INSERT может импортировать данные с диска (сетевого, гибкого, жесткого и т. д.).

Аргумент data_file должен указывать действительный путь с того сервера, на котором запущенSQL Server. Если аргумент data_file является удаленным файлом, указывайте имя в формате UNC. Имя в формате UNC имеет форму \\Имя_системы\Имя_общего_ресурса\Путь\Имя_файла.Например, \\SystemX\DiskZ\Sales\update.txt.
Область применения: SQL Server 2017 г. (14.x) CTP 1.1.
Начиная с SQL Server 2017 г. (14.x) CTP-версии 1.1, аргумент data_file может находиться в хранилище больших двоичных объектов Azure.

'' data_source_name '' 
Область применения: SQL Server 2017 г. (14.x) CTP 1.1.
Именованный внешний источник данных, указывающий на расположение импортируемого файла в хранилище больших двоичных объектов Azure. Внешний источник данных должен быть создан с помощью параметра TYPE = BLOB_STORAGE, который доступен в SQL Server 2017 г. (14.x) CTP-версии 1.1. Дополнительные сведения см. в разделе CREATE EXTERNAL DATA SOURCE.

BATCHSIZE =batch_size
Указывает число строк в одном пакете. Каждый пакет копируется на сервер за одну транзакцию. SQL Server фиксирует или откатывает транзакцию для каждого из пакетов. По умолчанию, все данные, содержащиеся в файле, передаются одним пакетом. Дополнительные сведения о вопросах производительности см. в подразделе «Замечания» далее в этом разделе.

CHECK_CONSTRAINTS
Указывает, что при выполнении операции массового импорта будет выполняться проверка всех ограничений целевой таблицы или представления. Без параметра CHECK_CONSTRAINTS все ограничения CHECK и FOREIGN KEY пропускаются, и после завершения операции ограничение таблицы помечается как ненадежное.

Примечание

Ограничения UNIQUE и PRIMARY KEY проверяются в любом случае. При импортировании в символьный столбец, имеющий ограничение NOT NULL, команда BULK INSERT вставляет пустую строку, если в текстовом файле нет значения.

Рано или поздно необходимо проверять всю таблицу на соответствие ограничениям. Если таблица перед началом операции массового импорта была не пуста, затраты на повторную проверку ограничений могут превысить затраты на применение ограничений CHECK к добавочным данным.

Отключение проверки ограничений (настройка по умолчанию) может потребоваться в тех ситуациях, когда входные данные содержат строки, нарушающие эти ограничения. Можно выполнить импорт данных при отключенной проверке ограничений CHECK, а затем при помощи инструкций Transact-SQL удалить недопустимые данные.

Примечание

Параметр MAXERRORS не влияет на проверку ограничений.

CODEPAGE = { ''ACP'' | ''OEM'' | ''RAW'' | ''code_page'' }
Указывает кодовую страницу данных в файле данных. Аргумент CODEPAGE имеет смысл только в том случае, если данные содержат столбцы типа char, varchar или text с символьными значениями, коды которых больше 127 или меньше 32.

Примечание

Microsoft рекомендует указывать имя параметров сортировки для каждого столбца в файле форматирования.

Значение аргумента CODEPAGE Description
ACP Столбцы типа char, varchar или text преобразуются из кодовой страницы ANSI/ Microsoft Windows (ISO 1252) в кодовую страницу SQL Server.
OEM (по умолчанию) Столбцы типа char, varchar или text преобразуются из кодовой страницы OEM в кодовую страницу SQL Server.
RAW Преобразование кодовой страницы не производится. Это самый быстрый режим.
code_page Номер кодовой страницы, например 850.

** Важно! *\* Версии до SQL Server 2016 (13.x) не поддерживают кодовую страницу 65001 (кодировка UTF-8).

DATAFILETYPE = { ''char'' | ''native'' | ''widechar'' | ''widenative'' }
Указывает, что инструкция BULK INSERT выполняет импорт из файла определенного типа.

Значение DATAFILETYPE Представление данных
char (по умолчанию) В символьном формате.

Дополнительные сведения см. в разделе Использование символьного формата для импорта и экспорта данных (SQL Server).
native В собственных типах базы данных. Создайте файл данных собственных типов путем массового импорта данных из SQL Server с помощью программы bcp.

Значение собственного типа обеспечивает более высокую производительность по сравнению со значением типа char.

Дополнительные сведения см. в разделе Использование собственного формата для импорта и экспорта данных (SQL Server).
widechar В Юникоде.

Дополнительные сведения см. в разделе Использование символьного формата Юникод для импорта и экспорта данных (SQL Server).
widenative В собственных типах базы данных, за исключением столбцов типа char, varchar и text, в которых данные хранятся в Юникоде. Создайте файл данных типа widenativeпутем массового импорта данных из SQL Server с помощью программы bcp.

Значение widenative обеспечивает более высокую производительность по сравнению с widechar. Если файл данных содержит расширенные символы ANSI, укажите значение widenative.

Дополнительные сведения см. в разделе Использование собственного формата Юникод для импорта и экспорта данных (SQL Server).

ERRORFILE =''file_name''
Указывает файл, используемый для сбора строк, которые имеют ошибки форматирования и не могут быть преобразованы в набор строк OLE DB. Эти строки без изменений копируются из файла данных в файл ошибок.

Файл ошибок создается на стадии выполнения команды. Если он уже существует, возникает ошибка. Дополнительно создается управляющий файл с расширением ERROR.txt. в котором содержатся ссылки на каждую из строк в файле ошибок и диагностические сведения. После исправления ошибок эти данные могут быть повторно загружены.
Область применения: SQL Server 2017 г. (14.x) CTP 1.1. Начиная с версии SQL Server 2017 г. (14.x), аргумент error_file_pathможет находиться в хранилище больших двоичных объектов Azure.

''errorfile_data_source_name''
Область применения: SQL Server 2017 г. (14.x) CTP 1.1. Именованный внешний источник данных, указывающий на расположение файла ошибки в хранилище больших двоичных объектов Azure, в котором будут содержаться ошибки, обнаруженные во время импорта.Внешний источник данных должен быть создан с помощью параметра TYPE = BLOB_STORAGE, который доступен в SQL Server 2017 г. (14.x) CTP-версии 1.1. Дополнительные сведения см. в разделе CREATE EXTERNAL DATA SOURCE.

FIRSTROW =first_row
Указывает номер первой строки для загрузки. Значение по умолчанию — первая строка указанного файла данных. Значения аргумента FIRSTROW начинаются с 1.

Примечание

Атрибут FIRSTROW не предназначен для пропуска заголовков столбцов. Пропуск заголовков не поддерживается инструкцией BULK INSERT. При пропуске строк компонентКомпонент SQL Server Database Engine выполняет поиск только в признаках конца поля и не проверяет данные в полях пропущенных строк.

FIRE_TRIGGERS
Указывает, что при массовом импорте будут выполняться триггеры типа INSERT, определенные для целевой таблицы. Если для операции INSERT определены триггеры в целевой таблице, они будут срабатывать для каждого загруженного пакета.

Если параметр FIRE_TRIGGERS не указан, триггеры Insert не выполняются.

FORMATFILE_DATASOURCE = ''data_source_name''
Применимо к: SQL Server 2017 г. (14.x) 1.1.
Именованный внешний источник данных, указывающий на расположение файла форматирования в хранилище больших двоичных объектов Azure, который будет определять схему импортированных данных. Внешний источник данных должен быть создан с помощью параметра TYPE = BLOB_STORAGE, который доступен в SQL Server 2017 г. (14.x) CTP-версии 1.1.Дополнительные сведения см. в разделе CREATE EXTERNAL DATA SOURCE.

KEEPIDENTITY
Указывает, что значение или значения идентификаторов в файле импортированных данных будут использоваться для столбца идентификаторов. Если параметр KEEPIDENTITY не указан, значения идентификаторов для этого столбца проверяются, но не импортируются, а SQL Serverавтоматически назначает уникальные значения на основе начального значения и приращения, указанных при создании таблицы. Если файл данных не содержит значений для столбца идентификаторов, укажите в файле форматирования, что столбец идентификаторов в таблице или представлении при импорте данных следует пропустить. В этом случае SQL Serverавтоматически назначит уникальные значения для этого столбца. Дополнительные сведения см. в разделе DBCC CHECKIDENT (Transact-SQL).

Дополнительные сведения о хранении значений идентификаторов см. в статье Сохранение значений идентификаторов при массовом импорте данных (SQL Server).

KEEPNULLS
Указывает, что пустым столбцам при массовом импорте должны присваиваться значения NULL, а не значения по умолчанию, назначенные для этих столбцов. Дополнительные сведения см. в разделе Сохранение значений NULL или использование значений по умолчанию при массовом импорте данных (SQL Server).

KILOBYTES_PER_BATCH = kilobytes_per_batch
Определяет приблизительное число килобайт данных в пакете как kilobytes_per_batch. По умолчанию, значение KILOBYTES_PER_BATCH неизвестно. Дополнительные сведения о вопросах производительности см. в подразделе «Замечания» далее в этом разделе.

LASTROW=last_row
Указывает номер последней строки для загрузки. Значение по умолчанию 0, что обозначает последнюю строку в указанном файле данных.

MAXERRORS = max_errors
Указывает максимальное число синтаксических ошибок, допустимых для файла данных, прежде чем операция массового импорта будет отменена. Каждая строка, импорт которой при массовом импорте не может быть выполнен, пропускается и считается за одну ошибку.Если аргумент max_errors не указан, значение по умолчанию равно 10.

Примечание

Параметр MAX_ERRORS не применяет проверки ограничения или преобразование типов данных money и bigint.

ORDER ( { column [ ASC | DESC ] } [ ,... n ] )
Указывает, каким образом отсортированы данные в файле. Производительность массового импорта увеличивается, если импортируемые данные упорядочены согласно кластеризованному индексу таблицы (при наличии). Если файл данных упорядочен в другом порядке, то есть в порядке отличном от порядка ключа кластеризованного индекса или если в таблице отсутствует кластеризованный индекс, то предложение ORDER не обрабатывается. В целевой таблице должны быть указаны имена столбцов. По умолчанию, операция массовой вставки считает, что файл данных не отсортирован. Для оптимизированного массового импорта SQL Server , помимо прочего, проверяет сортировку импортируемых данных.

n
заполнитель, означающий, что может быть указано несколько столбцов.

ROWS_PER_BATCH =rows_per_batch
Указывает приблизительное число строк в файле данных.

По умолчанию все данные в файле отправляются на сервер за одну транзакцию, а число строк в пакете оптимизатору запросов неизвестно. Если указать аргумент ROWS_PER_BATCH (со значением > 0), сервер будет использовать это значение для оптимизации операции массового импорта. Значение, указанное в ROWS_PER_BATCH, должно приблизительно совпадать с фактическим числом строк. Дополнительные сведения о вопросах производительности см. в подразделе «Замечания» далее в этом разделе.

TABLOCK
Указывает необходимость запроса блокировки уровня таблицы на время выполнения массового импорта. Если таблица не имеет индексов и указано ключевое слово TABLOCK, загрузка в таблицу может производиться параллельно несколькими клиентами. По умолчанию работа блокировки определяется параметром таблицы table lock on bulk load. Блокировка на время выполнения массового импорта значительно повышает производительность, позволяя снизить состязание блокировок таблицы. Дополнительные сведения о вопросах производительности см. в подразделе «Замечания» далее в этом разделе.

Для индекса columnstore Поведение блокировки будет другим из-за внутреннего разделения на несколько наборов строк. Каждый поток загружает данные отдельно в каждый набор строк, выполняя X-блокировку в наборе строк, что позволяет загружать данные параллельно с сеансами загрузки данных. При использовании параметра TABLOCK поток применит X-блокировку к таблице (в отличие от блокировки BU для традиционных наборов строк), что сделает невозможной одновременную загрузку данных для других параллельных потоков.

Параметры формата входного файла

FORMAT = ''CSV''
Область применения: SQL Server 2017 г. (14.x) CTP 1.1.
Указывает файл данных с разделителями-запятыми, соответствующий стандарту RFC 4180.

FIELDQUOTE = ''field_quote''
Область применения: SQL Server 2017 г. (14.x) CTP 1.1.
Определяет символ, который будет использоваться в качестве символа кавычки в CSV-файле.Если этот символ не задан, в качестве символа кавычки будет использоваться символ (") согласно стандарту RFC 4180.

FORMATFILE =''format_file_path''
Указывает полный путь к файлу форматирования. Этот файл форматирования содержит описание файла данных — сведения, полученные путем применения программы bcp к той же таблице или представлению. И предназначен для случаев, когда:

  • файл данных содержит больше или меньше столбцов, чем таблица или представление;

  • столбцы расположены в другом порядке;

  • отличаются разделители столбцов;

  • имеются какие-либо другие изменения в формате данных. Файлы форматирования обычно создаются с помощью программы bcp и затем при необходимости изменяются в текстовом редакторе. Дополнительные сведения см. в разделе bcp Utility.

Область применения: SQL Server 2017 г. (14.x) CTP 1.1.
Начиная с SQL Server 2017 г. (14.x) CTP-версии 1.1, аргумент format_file_path может находиться в хранилище больших двоичных объектов Azure.

FIELDTERMINATOR =''признак_конца_поля''
Указывает признак конца поля, используемый для файлов данных типа char и widechar. По умолчанию, признаком конца поля является символ табуляции (\t). Дополнительные сведения см. в разделе Определение признаков конца поля и строки (SQL Server).

ROWTERMINATOR =''признак_конца_строки''
Указывает признак конца строки, используемый для файлов данных типа char и widechar. По умолчанию признаком конца строки является символ \r\n (символ перевода строки).Дополнительные сведения см. в разделе Определение признаков конца поля и строки (SQL Server).

Совместимость

Инструкция BULK INSERT осуществляет более строгую проверку загружаемых из файла данных, что может вызвать прекращение работы существующих скриптов, которые ранее работали с неправильными данными. В частности, теперь BULK INSERT проверяет следующее:

  • собственные представления типов данных float или real являются допустимыми;

  • Данные в Юникоде имеют четную длину.

Типы данных

Преобразование символьного типа данных в десятичный

Преобразования символьного типа данных в десятичный, которые используются в инструкции BULK INSERT, следуют тем же правилам, что и функция Transact-SQL CONVERT, которая отклоняет числовые значения в экспоненциальном представлении. Такие строки инструкция BULK INSERT трактует как недопустимые и создает отчет ошибки преобразования.

Чтобы решить эту проблему, применяется файл форматирования, позволяющий выполнить массовый импорт данных типа float в экспоненциальном представлении в десятичный столбец. В файле форматирования необходимо явно описать столбец с типом данных real или float. Дополнительные сведения об этих типах данных см. в разделе Типы данных float и real (Transact-SQL).

Примечание

Файлы форматирования представляют данные real в виде типа данных SQLFLT4, а данные float — в виде типа данных SQLFLT8. Дополнительные сведения о файлах формата, отличного от XML, см. в разделе Указание типа файлового хранилища с помощью программы bcp (SQL Server).

Пример импорта числового значения в экспоненциальном представлении

В этом примере используется следующая таблица:

CREATE TABLE t_float(c1 float, c2 decimal (5,4));  

Пользователю необходимо выполнить массовый импорт данных в таблицу t_float. Файл данных C:\t_float-c.dat содержит данные в экспоненциальном представлении float, например:

8.0000000000000002E-28.0000000000000002E-2  

Однако инструкция BULK INSERT не сможет выполнить импорт этих данных непосредственно в таблицу t_float, так как второй столбец c2 имеет тип данных decimal. Поэтому необходим файл форматирования. В нем данные типа float в экспоненциальном представлении должны быть сопоставлены десятичному формату столбца c2.

Следующий файл форматирования использует тип данных SQLFLT8 для сопоставления второго поля данных со вторым столбцом:

<?xml version="1.0"?> 
<BCPFORMAT xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
<RECORD> 
<FIELD ID="1" xsi:type="CharTerm" TERMINATOR="\t" MAX_LENGTH="30"/> 
<FIELD ID="2" xsi:type="CharTerm" TERMINATOR="\r\n" MAX_LENGTH="30"/>  </RECORD>  <ROW> 
<COLUMN SOURCE="1" NAME="c1" xsi:type="SQLFLT8"/> 
<COLUMN SOURCE="2" NAME="c2" xsi:type="SQLFLT8"/>  </ROW> </BCPFORMAT> 

Чтобы задействовать этот файл форматирования (файл C:\t_floatformat-c-xml.xml) при импорте тестовых данных в тестовую таблицу, необходимо выполнить следующую инструкциюTransact-SQL:

BULK INSERT bulktest..t_float  
FROM ''C:\t_float-c.dat'' WITH (FORMATFILE=''C:\t_floatformat-c-xml.xml'');  
GO  

Типы данных для массового экспорта или импорта документов SQLXML

Для массового экспорта или импорта данных SQLXML используется один из следующих типов данных в файле форматирования.

Тип данных Действие
SQLCHAR или SQLVARCHAR Данные отправляются в кодовой странице клиента или кодовой странице, определенной параметрами сортировки. Тот же эффект достигается указанием параметра DATAFILETYPE =''char'' без указания файла форматирования.
SQLNCHAR или SQLNVARCHAR Данные отправляются в Юникоде. Тот же эффект достигается указанием параметра DATAFILETYPE = ''widechar'' без указания файла форматирования.
SQLBINARY или SQLVARBIN Данные отправляются без преобразования.

Общие замечания

Сравнение инструкции BULK INSERT, инструкции INSERT ... SELECT * FROM OPENROWSET(BULK...) и команды bcp см. в разделе Массовый импорт и экспорт данных (SQL Server).

Дополнительные сведения о подготовке данных к массовому импорту см. в разделе Подготовка данных к массовому экспорту или импорту (SQL Server).

Инструкция BULK INSERT может выполняться внутри пользовательской транзакции для импорта данных в таблицу или представление. При необходимости использовать несколько соответствий для массового импорта данных, в транзакции можно указать предложение BATCHSIZE в инструкции BULK INSERT. При откате транзакции, состоящей из нескольких пакетов, каждый из пакетов, который в процессе транзакции был отправлен в SQL Server, откатывается.

Совместимость

Импорт данных из CSV-файла

Начиная с SQL Server 2017 г. (14.x) CTP 1.1, инструкция BULK INSERT поддерживает формат CSV.
До SQL Server 2017 г. (14.x) CTP 1.1 CSV-файлы с разделителями-запятыми не поддерживаются в операциях массового импорта SQL Server. Однако в некоторых случаях CSV-файл можно использовать в качестве файла данных для массового импорта данных в SQL Server.Дополнительные сведения о требованиях к импорту данных из CSV-файла см. в разделе Подготовка данных к массовому экспорту или импорту (SQL Server).

Режим ведения журнала

Сведения о том, когда в журнале транзакций регистрируются операции вставки строк, выполняемые при массовом импорте, см. в разделе Предварительные условия для минимального протоколирования массового импорта данных.

Ограничения

При использовании файла форматирования с BULK INSERT можно указать не более 1024 полей. Это значение совпадает с максимальным числом столбцов в таблице. При использовании инструкции BULK INSERT с файлом данных, который содержит больше 1024 поля, формируется ошибка 4822. Программа bcp не имеет этого ограничения, поэтому для файлов данных, которые содержат больше 1024 поля, используйте команду bcp.

Вопросы производительности

Если число страниц, которые должны быть записаны на диск в едином пакете, превышает внутренний порог, может быть произведен полный просмотр буферного пула для определения страниц, подлежащих записи на диск при фиксации пакета. Такой полный просмотр может повредить производительности массового импорта. Превышение внутреннего порога может возникнуть, если большой буферный пул работает с медленной подсистемой ввода-вывода. Избежать переполнения буфера на больших компьютерах можно либо отказавшись от использования указания TABLOCK (что удалит оптимизацию массовых операций), либо задав меньший размер пакета (что сохранит оптимизацию массовых операций).

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

безопасность

Делегирование учетных записей безопасности (Олицетворение)

Если пользователь использует имя входа SQL Server , то применяется профиль безопасности учетной записи процесса SQL Server . За пределами компонента Database Engine невозможно выполнить проверку подлинности имени входа, проходящего проверку подлинности SQL Server. Поэтому, если имя входа, использующее проверку подлинности SQL Server, инициирует команду BULK INSERT, подключение к данным устанавливается с помощью контекста безопасности учетной записи процесса SQL Server (учетной записи, которая используется службой SQL Server Database Engine). Для того чтобы прочитать исходные данные, учетной записи, которая используется службой SQL Server Database Engine, необходимо предоставить доступ к этим исходным данным. Если же пользователь SQL Server входит в систему с проверкой подлинности Windows, то ему доступны только те файлы, к которым имеет доступ учетная запись пользователя, независимо от профиля безопасности процесса SQL Server.

Если с помощью программы sqlcmd или osql инструкция BULK INSERT выполняется на одном компьютере, вставка данных происходит в SQL Server на другом компьютере, а аргумент data_file указывается на третьем компьютере с помощью UNC-пути, то может возникнуть ошибка 4861.

Чтобы решить эту проблему, воспользуйтесь проверкой подлинности SQL Server и укажите имя входа SQL Server, которое использует профиль безопасности учетной записи процесса SQL Server, либо настройте Windows для делегирования учетных записей безопасности.Дополнительные сведения о том, как сделать учетную запись пользователя доступной для делегирования, см. в справке по Windows.

Дополнительные сведения о вопросах безопасности при использовании BULK INSERT см. в статье Массовый импорт данных при помощи инструкции BULK INSERT или OPENROWSET(BULK...) (SQL Server).

Разрешения

Требует разрешений INSERT и ADMINISTER BULK OPERATIONS. В базе данных SQL Azure требуются разрешения INSERT и ADMINISTER DATABASE BULK OPERATIONS. Кроме того, необходимо разрешение ALTER TABLE, если выполняется одно из следующих условий.

  • Существуют ограничения, и параметр CHECK_CONSTRAINTS не указан.

    Примечание

    Ограничения отключены по умолчанию. Чтобы проверить ограничения явно, укажите параметр CHECK_CONSTRAINTS.

  • Триггеры существуют, и параметр FIRE_TRIGGER не указан.

    Примечание

    По умолчанию, триггеры не срабатывают. Чтобы явно включить триггеры, укажите параметр FIRE_TRIGGER.

  • Для импорта значений идентификаторов из файла данных указан параметр KEEPIDENTITY.

Примеры

A. Применение символа вертикальной черты для импорта данных из файла

В следующем примере выполняется импорт подробных сведений о заказах из указанного файла данных в таблицу AdventureWorks2012.Sales.SalesOrderDetail, используя символ вертикальной черты (|) в качестве признака конца столбца и |\n в качестве признака конца строки.

BULK INSERT AdventureWorks2012.Sales.SalesOrderDetail  
   FROM ''f:\orders\lineitem.tbl''  
   WITH   
      (  
         FIELDTERMINATOR ='' |'',  
         ROWTERMINATOR ='' |\n''  
      );  

Б. Применение аргумента FIRE_TRIGGERS

В следующем примере указывается аргумент FIRE_TRIGGERS.

BULK INSERT AdventureWorks2012.Sales.SalesOrderDetail  
   FROM ''f:\orders\lineitem.tbl''  
   WITH  
     (  
        FIELDTERMINATOR ='' |'',  
        ROWTERMINATOR = '':\n'',  
        FIRE_TRIGGERS  
      );  

В. Применение символа перевода строки в качестве признака конца строки

В следующем примере производится импорт файла, в котором в качестве признака конца строки используется символ перевода строки, как в файлах UNIX.

DECLARE @bulk_cmd varchar(1000);  
SET @bulk_cmd = ''BULK INSERT AdventureWorks2012.Sales.SalesOrderDetail  
FROM ''''<drive>:\<path>\<filename>''''   
WITH (ROWTERMINATOR = ''''''+CHAR(10)+'''''')'';  
EXEC(@bulk_cmd);  

Примечание

В соответствии с тем, как в Microsoft Windows обрабатываются текстовые файлы, (\nавтоматически заменяется на \r\n).

Г. Указание кодовой страницы

В следующем примере показано указание кодовой страницы.

BULK INSERT MyTable  
FROM ''D:\data.csv''  
WITH  
( CODEPAGE = ''65001'',  
    DATAFILETYPE = ''char'',  
    FIELDTERMINATOR = '',''  
);  

Д. Импорт данных из CSV-файла

В следующем примере показано указание CSV-файла.

BULK INSERT Sales.Invoices
FROM ''\\share\invoices\inv-2016-07-25.csv''
WITH (FORMAT = ''CSV''); 

Е. Импорт данных из файла в хранилище BLOB-объектов Azure

В следующем примере показано, как загрузить данные из CSV-файла в расположение хранилища BLOB-объектов Azure, которое была настроено в качестве внешнего источника данных. Для этого требуются учетные данные для базы с подписанным URL-адресом.

SQL
BULK INSERT Sales.Invoices
FROM ''inv-2017-01-19.csv''
WITH (DATA_SOURCE = ''MyAzureInvoices'',
     FORMAT = ''CSV'');