BULK INSERT (Transact-SQL)
Выполняет импорт файла данных в таблицу или представление базы данных в формате, указанном пользователем.
Синтаксис
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' } ]
[ [ , ] FIELDTERMINATOR = 'field_terminator' ]
[ [ , ] FIRSTROW = first_row ]
[ [ , ] FIRE_TRIGGERS ]
[ [ , ] FORMATFILE = 'format_file_path' ]
[ [ , ] 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 ]
[ [ , ] ERRORFILE = 'file_name' ]
)]
Аргументы
database_name
Имя базы данных, в которой находится указанная таблица или представление. Если не указано, предполагается текущая база данных.schema_name
Имя схемы таблицы или представления. Указание аргумента schema_name необязательно, если схемой по умолчанию для пользователя, выполняющего операцию массового импорта, является схема указанной таблицы или представления. Если аргумент schema не указан и схема по умолчанию для пользователя, выполняющего операцию массового импорта, отличается от схемы таблицы или представления, SQL Server возвращает сообщение об ошибке и операция массового импорта не выполняется.table_name
Имя таблицы или представления, куда производится массовый импорт данных. Могут указываться только те представления, в которых все столбцы относятся к одной и той же базовой таблице. Дополнительные сведения об ограничениях при загрузке данных в представления см. в разделе Инструкция INSERT (Transact-SQL).'data_file'
Полный путь и имя файла данных, который содержит импортируемые в указанную таблицу или представление данные. Инструкция BULK INSERT может импортировать данные с диска (сетевого, гибкого, жесткого и т. д.).Аргумент data_file должен содержать действительный путь с того сервера, на котором запущен SQL Server. Если аргумент data_file является удаленным файлом, указывайте имя в формате UNC. Имя в формате UNC имеет форму \\Имя_системы\Общая_папка\Путь\Имя_файла. Например, \\SystemX\DiskZ\Sales\update.txt.
BATCHSIZE **=**batch_size
Указывает число строк в одном пакете. Каждый пакет копируется на сервер за одну транзакцию. SQL Server фиксирует или откатывает транзакцию для каждого из пакетов. По умолчанию, все данные, содержащиеся в файле, передаются одним пакетом. Дополнительные сведения о вопросах производительности см. в подразделе «Примечания» далее в этом разделе.Дополнительные сведения см. в разделе Управление пакетами для массового импорта данных.
CHECK_CONSTRAINTS
Указывает, что при выполнении операции массового импорта будет выполняться проверка всех ограничений целевой таблицы или представления. Без параметра CHECK_CONSTRAINTS все ограничения CHECK и FOREIGN KEY пропускаются, и после завершения операции ограничение таблицы помечается как ненадежное.Примечание
Ограничения UNIQUE, PRIMARY KEY и NOT NULL проверяются в любом случае.
Рано или поздно необходимо проверять всю таблицу на соответствие ограничениям. Если таблица перед началом операции массового импорта была не пуста, затраты на повторную проверку ограничений могут превысить затраты на применение ограничений CHECK к добавочным данным.
Отключение проверки ограничений (настройка по умолчанию) может потребоваться в тех ситуациях, когда входные данные содержат строки, нарушающие эти ограничения. Можно выполнить импорт данных при отключенной проверке ограничений CHECK, а затем при помощи инструкций Transact-SQL удалить недопустимые данные.
Примечание
Параметр MAXERRORS не влияет на проверку ограничений.
Примечание
В SQL Server 2005 и более поздних версиях в инструкцию BULK INSERT включены новые проверки данных, которые могут привести к прекращению работы существующих сценариев, выполнявшихся ранее при наличии в файле неправильных данных.
Дополнительные сведения см. в разделе Управление проверкой ограничений при операциях массового импорта.
CODEPAGE = { **'**ACP '| ' OEM ' | ' RAW '| 'code_page' }
Указывает кодовую страницу данных в файле данных. Аргумент CODEPAGE имеет смысл только в том случае, если данные содержат столбцы типа char, varchar или text с символами, коды которых больше 127 или меньше 32.Примечание
Корпорация Майкрософт рекомендует указывать имя параметров сортировки для каждого столбца в файле форматирования.
Значение аргумента CODEPAGE
Описание
ACP
Столбцы типа char, varchar или text преобразуются из кодовой страницы ANSI/Microsoft Windows (ISO 1252) в кодовую страницу SQL Server.
OEM (по умолчанию)
Столбцы типов данных char, varchar и text преобразуются из системной кодовой страницы OEM в кодовую страницу SQL Server.
RAW
Преобразование кодовой страницы не производится. Это самый быстрый режим.
code_page
Номер кодовой страницы, например 850.
Важно!
SQL Server не поддерживает кодовую страницу 65001 (кодировка UTF-8).Дополнительные сведения см. в разделе Копирование данных между различными параметрами сортировки.
DATAFILETYPE = { 'char' | 'native' | 'widechar' | 'widenative' }
Указывает, что инструкция BULK INSERT выполняет импорт из файла определенного типа.Значение DATAFILETYPE
Представление данных
char (по умолчанию)
В символьном формате.
Дополнительные сведения см. в разделе Применение символьного формата при импорте и экспорте данных.
native
В собственных типах базы данных. Файл данных собственных типов создан путем массового импорта данных из SQL Server с помощью программы bcp.
Значение собственного типа обеспечивает более высокую производительность по сравнению со значением типа char.
Дополнительные сведения см. в разделе Использование собственного формата для импорта и экспорта данных.
widechar
В Юникоде.
Дополнительные сведения см. в разделе Использование символьного формата Юникода для импорта и экспорта данных.
widenative
В собственных типах базы данных, за исключением столбцов типа char, varchar и text, в которых данные хранятся в Юникоде. Файл данных типа widenative создан путем массового импорта данных из SQL Server с помощью программы bcp.
Значение widenative обеспечивает более высокую производительность по сравнению с widechar. Если файл данных содержит символы национального алфавита ANSI, укажите значение widenative.
Дополнительные сведения см. в разделе Использование собственного формата Юникода для импорта или экспорта данных.
FIELDTERMINATOR ='field_terminator'
Указывает признак конца поля, используемый для файлов данных типа char и widechar. По умолчанию, признаком конца поля является символ табуляции (\t). Дополнительные сведения см. в разделе Определение признаков конца поля и строки.FIRSTROW **=**first_row
Указывает номер первой строки для загрузки. Значение по умолчанию — первая строка указанного файла данных. Значения аргумента FIRSTROW начинаются с 1.Примечание
Атрибут FIRSTROW не предназначен для пропуска заголовков столбцов. Пропуск заголовков не поддерживается инструкцией BULK INSERT. При пропуске строк компонент SQL Server Database Engine выполняет поиск только в признаках конца поля и не проверяет данные в полях пропущенных строк.
FIRE_TRIGGERS
Указывает, что при массовом импорте будут выполняться триггеры Insert, определенные для целевой таблицы. Если для операции INSERT определены триггеры, они будут срабатывать для каждого загруженного пакета.Если параметр FIRE_TRIGGERS не указан, триггеры Insert не выполняются.
Дополнительные сведения см. в разделе Управление выполнением триггеров при массовом импорте данных.
FORMATFILE ='format_file_path'
Указывает полный путь к файлу форматирования. Этот файл содержит описание файла данных — сведения, полученные с помощью программы bcp на такой же таблице или представлении. И предназначен для случаев, когда:файл данных содержит больше или меньше столбцов, чем таблица или представление;
столбцы расположены в другом порядке;
отличаются разделители столбцов;
имеются какие-либо другие изменения в формате данных. Файлы форматирования обычно создаются с помощью программы bcp и затем при необходимости изменяются в текстовом редакторе. Дополнительные сведения см. в разделе Программа bcp.
KEEPIDENTITY
Указывает, что значение или значения идентификаторов в файле импортированных данных будут использоваться для столбца идентификаторов. Если параметр KEEPIDENTITY не указан, значения идентификаторов для этого столбца проверяются, но не импортируются, а SQL Server автоматически назначает уникальные значения на основе начального значения и приращения, указанных при создании таблицы. Если файл данных не содержит значений для столбца идентификаторов, укажите в файле форматирования, что столбец идентификаторов в таблице или представлении при импорте данных следует пропустить. В этом случае SQL Server автоматически назначит уникальные значения для этого столбца. Дополнительные сведения см. в разделе DBCC CHECKIDENT (Transact-SQL).Дополнительные сведения о хранении значений идентификации см. в разделе Сохранение значений идентификаторов при массовом импорте данных.
KEEPNULLS
Указывает, что пустым столбцам при массовом импорте должны присваиваться значения NULL, а не значения по умолчанию, назначенные для этих столбцов. Дополнительные сведения см. в разделе Сохранение значений NULL или использование значений по умолчанию при массовом импорте данных.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, должно приблизительно совпадать с фактическим числом строк. Дополнительные сведения о вопросах производительности см. в подразделе «Примечания» далее в этом разделе.
Дополнительные сведения см. в разделе Управление пакетами для массового импорта данных.
ROWTERMINATOR ='row_terminator'
Указывает признак конца строки, используемый для файлов данных типа char и widechar. По умолчанию, признаком конца строки является символ \r\n (символ перевода строки). Дополнительные сведения см. в разделе Определение признаков конца поля и строки.TABLOCK
Указывает необходимость запроса блокировки уровня таблицы на время выполнения массового импорта. Если таблица не имеет индексов и указано ключевое слово TABLOCK, загрузка в таблицу может производиться параллельно несколькими клиентами. По умолчанию работа блокировки определяется параметром таблицы table lock on bulk load. Блокировка на время выполнения массового импорта значительно повышает производительность, позволяя снизить конфликты блокировок таблицы. Дополнительные сведения о вопросах производительности см. в подразделе «Примечания» далее в этом разделе.Дополнительные сведения см. в разделе Управление операциями блокировки при массовом импорте.
ERRORFILE ='file_name'
Указывает файл, используемый для сбора строк, которые имеют ошибки форматирования и не могут быть преобразованы в набор строк OLE DB. Эти строки без изменений копируются из файла данных в файл ошибок.Файл ошибок создается на стадии выполнения команды. Если он уже существует, возникает ошибка. Дополнительно создается управляющий файл с расширением ERROR.txt. в котором содержатся ссылки на каждую из строк в файле ошибок и диагностические сведения. После исправления ошибок эти данные могут быть повторно загружены.
Замечания
Сравнение инструкции BULK INSERT, инструкции INSERT ... SELECT * FROM OPENROWSET(BULK...) и команды bcp см. в разделе Операции массового импорта и массового экспорта.
Дополнительные сведения о подготовке данных для массового импорта, например требования при импортировании данных из CSV-файла, см. в разделе Подготовка данных к массовому экспорту или импорту.
Инструкция BULK INSERT может быть выполнена в пользовательской транзакции. Откат пользовательской транзакции, содержащей инструкцию BULK INSERT с предложением BATCHSIZE, производящим импорт данных в таблицу или представление несколькими пакетами, вызывает откат всех пакетов, отправленных на SQL Server.
Сведения о том, когда в журнале транзакций регистрируются операции вставки строк, выполняемые при массовом импорте, см. в разделе Предварительные условия для минимального ведения журнала массового импорта данных.
В SQL Server 2005 и более поздних версиях в инструкцию BULK INSERT включена новая, более строгая проверка загружаемых из файла данных, что может вызвать прекращение работы существующих сценариев, которые ранее работали с неправильными данными. В частности, теперь BULK INSERT проверяет, что:
собственные представления типов данных float или real являются допустимыми;
данные в Юникоде имеют четную длину.
Для данных в неверном формате, которые в предыдущих версиях SQL Server загружались, операция массового импорта может не выполниться. В предыдущих версиях SQL Server ошибка не происходит до тех пор, пока клиент не пытается получить доступ к недопустимым данным. Более строгая проверка снижает вероятность непредвиденных ситуаций во время запроса данных после массового импорта.
Вопросы производительности
Если число страниц, которые должны быть записаны на диск в едином пакете, превышает внутренний порог, то может быть произведен полный просмотр буферного пула для определения страниц, подлежащих записи на диск при фиксации пакета. Такой полный просмотр может повредить производительности массового импорта. Превышение внутреннего порога может возникнуть, если большой буферный пул работает с медленной подсистемой ввода-вывода. Избежать переполнения буфера на больших компьютерах можно либо отказавшись от использования подсказки TABLOCK (что удалит оптимизацию массовых операций), либо задав меньший размер пакета (что сохранит оптимизацию массовых операций).
В связи с различиями в компьютерах рекомендуется испытать свою рабочую нагрузку с различными размерами пакетов, чтобы выявить оптимальный вариант.
Массовый экспорт или импорт документов SQLXML
Для массового экспорта или импорта данных SQLXML используется один из следующих типов данных в файле форматирования:
Тип данных |
Эффект |
---|---|
SQLCHAR или SQLVARYCHAR |
Данные отправляются в кодовой странице клиента или кодовой странице, определенной параметрами сортировки. Тот же эффект достигается указанием параметра DATAFILETYPE ='char' без указания файла форматирования. |
SQLNCHAR или SQLNVARCHAR |
Данные отправляются в Юникоде. Тот же эффект достигается указанием параметра DATAFILETYPE = 'widechar' без указания файла форматирования. |
SQLBINARY или SQLVARYBIN |
Данные отправляются без преобразования. |
Преобразование типов из символьного в десятичный
В SQL Server 2005 и более поздних версиях выполняемые инструкцией BULK INSERT преобразования типа из символьного в десятичный следуют тем же правилам, что и функция Transact-SQLCONVERT, которая не воспринимает числовые значения в экспоненциальном представлении. Такие строки трактуются как недопустимые и порождают ошибки преобразования.
![]() |
---|
В SQL Server версии 7.0 и SQL Server 2000, инструкция BULK INSERT поддерживает преобразование строкового типа в десятичный для строк, представляющих собой числовые значения, которые используют экспоненциальный формат. |
Чтобы решить эту проблему, применяется файл форматирования, позволяющий выполнить массовый импорт данных типа float в экспоненциальном представлении в десятичный столбец. В файле форматирования необходимо явно описать столбец с типом данных real или float. Дополнительные сведения об этих типах данных см. в разделе Типы данных float и real (Transact-SQL).
![]() |
---|
Файл форматирования представляет данные типа real в виде SQLFLT4, а float — в виде SQLFLT8. Дополнительные сведения о XML-файлах форматирования см. в разделе Синтаксис схемы для XML-файлов форматирования; о файлах форматирования, отличных от XML, см. в разделе Указание типа файлового хранилища с помощью программы bcp. |
Пример импорта числового значения в экспоненциальном представлении
В этом примере используется следующая таблица:
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="https://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
Разрешения
Требует разрешений INSERT и ADMINISTER BULK OPERATIONS. Кроме того, необходимо разрешение ALTER TABLE, если выполняется одно из следующих условий:
Существуют ограничения, и параметр CHECK_CONSTRAINTS не указан.
Примечание
Ограничения отключены по умолчанию. Чтобы проверить ограничения явно, укажите параметр CHECK_CONSTRAINTS.
Триггеры существуют, и параметр FIRE_TRIGGER не указан.
Примечание
По умолчанию, триггеры не срабатывают. Чтобы явно включить триггеры, укажите параметр FIRE_TRIGGER.
Для импорта значений идентификаторов из файла данных указан параметр KEEPIDENTITY.
Делегирование учетных записей безопасности (Олицетворение)
Если пользователь 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...).
Примеры
А. Применение вертикальной черты в качестве признака конца столбца при импорте данных из файла
В следующем примере выполняется импорт подробных сведений о заказах из указанного файла данных в таблицу AdventureWorks.Sales.SalesOrderDetail, используя символ вертикальной черты (|) в качестве признака конца столбца и |\n в качестве признака конца строки.
BULK INSERT AdventureWorks.Sales.SalesOrderDetail
FROM 'f:\orders\lineitem.tbl'
WITH
(
FIELDTERMINATOR =' |',
ROWTERMINATOR =' |\n'
)
Б. Применение аргумента FIRE_TRIGGERS
В следующем примере указывается аргумент FIRE_TRIGGERS.
BULK INSERT AdventureWorks.Sales.SalesOrderDetail
FROM 'f:\orders\lineitem.tbl'
WITH
(
FIELDTERMINATOR =' |',
ROWTERMINATOR = ':\n',
FIRE_TRIGGERS
)
В. Применение перевода строки в качестве признака конца строки
В следующем примере производится импорт файла, в котором в качестве признака конца строки используется символ перевода строки, как в файлах UNIX:
DECLARE @bulk_cmd varchar(1000)
SET @bulk_cmd = 'BULK INSERT AdventureWorks.Sales.SalesOrderDetail
FROM ''<drive>:\<path>\<filename>''
WITH (ROWTERMINATOR = '''+CHAR(10)+''')'
EXEC(@bulk_cmd)
Дополнительные примеры
Другие примеры использования инструкции BULK INSERT содержатся в следующих разделах:
Сохранение значений идентификаторов при массовом импорте данных
Сохранение значений NULL или использование значений по умолчанию при массовом импорте данных
Использование файла форматирования для массового импорта данных
Применение символьного формата при импорте и экспорте данных
Использование собственного формата для импорта и экспорта данных
Использование символьного формата Юникода для импорта и экспорта данных
Использование собственного формата Юникода для импорта или экспорта данных
Использование файла форматирования для привязки столбцов таблицы к полям файла данных
Журнал изменений
Обновленное содержимое |
---|
Дополнительные сведения о вопросах производительности см. в разделе «Примечания». |
Обновлено описание параметра FIRSTROW. |
Обновлено описание аргумента code_page. |
См. также