Опубликован: 11.12.2006 | Доступ: свободный | Студентов: 5820 / 381 | Оценка: 4.42 / 3.86 | Длительность: 57:15:00
Лекция 24:

Загрузка базы данных

Оператор BULK INSERT

Оператор T-SQL BULK INSERT аналогичен программе BCP – в том смысле, что оба средства можно использовать для массового копирования данных из файла данных в базу данных SQL Server. Но, в отличие от BCP, оператор BULK INSERT нельзя использовать для извлечения данных из баз данных SQL Server. Это ограничение уменьшает его функциональные возможности, но поскольку оператор BULK INSERT выполняется как поток внутри SQL Server, это устраняет необходимость передачи данных из одной программы в другую, что повышает производительность при загрузке данных. Таким образом, оператор BULK INSERT загружает данные более эффективно, чем программа BCP.

Синтаксис BULK INSERT

Как и BCP, оператор BULK INSERT имеет несколько обязательных параметров и много необязательных. Вызов BULK INSERT из SQL Server (с помощью ISQL, OSQL или анализатора запросов [Query Analyzer]) происходит с помощью следующего оператора. (Здесь приводятся все обязательные и необязательные параметры.)

BULK INSERT   [['имя_базы_данных'.]['владелец'].]
                       {'имя_таблицы' | 'имя_представления' FROM 'файл_данных' }
  [WITH   (  
                    [BATCHSIZE [ = размер_группы ]]
                    [[,] CHECK_CONSTRAINTS ]
                    [[,] CODEPAGE [ = 'ACP' | 'OEM' | 'RAW' | 'кодовая_страница']]
                    [[,] DATAFILETYPE [ = {'char'|’native’|
                                                   'widechar'|’widenative’}]]
                    [[,] FIELDTERMINATOR [ = 'ограничитель_полей' ]]
                    [[,] FIRSTROW [ = первая_строка ]]
                    [[,] FIRETRIGGERS [ = триггеры ]]
                    [[,] FORMATFILE [ = 'путь_к_форматному_файлу' ]]
                    [[,] KEEPIDENTITY ]
                    [[,] KEEPNULLS ]  
                    [[,] KILOBYTES_PER_BATCH [ = килобайт_на_группу ]]
                    [[,] LASTROW [ = последняя_строка ]]
                    [[,] MAXERRORS [ = максимум_ошибок ]]
                    [[,] ORDER ( { колонка [ ASC | DESC ]}[ ,...n ])]
                    [[,] ROWS_PER_BATCH [ = строк_на_группу ]]
                    [[,] ROWTERMINATOR [ = 'разделитель_строк' ]]
                    [[,] TABLOCK ]
                      )]
Обязательные параметры

Местоположение файла данных указывается параметром файл_данных. Это должен быть допустимый путь доступа к файлу.

Местоположение базы данных, в которую помещаются данные, задается определением таблицы или представлением. Как видно из определения синтаксиса оператора, вы можете также указывать владельца таблицы или представления и/или имя базы данных. Если использовать эту команду массовой вставки для вставки данных в какое-либо представление, то вы можете затрагивать только одну из базовых таблиц, указываемую в предложении FROM этого представления.

Необязательные параметры

Вы можете использовать необязательные параметры и ключевые слова, которые перечислены в табл. 24.3, чтобы модифицировать поведение BULK INSERT. Как вы увидите из описания, параметры, которые можно использовать с оператором BULK INSERT, аналогичны параметрам программы BCP.

Таблица 24.3. Необязательные параметры для оператора BULK INSERT
Необязательный параметр Описание
BATCHSIZE = размер Указывает количество строк в группе (пакетном задании). Каждая группа обрабатывается как одна транзакция
CHECK_CONSTRAINTS Указывает на то, что будет выполняться проверка ограничений. По умолчанию ограничения игнорируются.
CODEPAGE [ = 'ACP' | 'OEM' | 'RAW' | 'кодовая_страница' ] Указывает кодовую страницу данных в файле данных. Этот параметр полезно использовать только с типами данных char, varchar и text
ATAFILETYPE [ = 'char' | 'native' | 'widechar' | 'widenative' ] Указывает тип данных в файле данных; по умолчанию это тип char. Другие типы: native (собственные типы данных базы данных), widechar (символы Unicode) и widenative (то же, что и native, но типы char, varchar и text сохраняются как Unicode)
FIELDTERMINATOR [ = ограничитель_полей ] Указывает ограничитель полей, используемый с типами данных char и widechar. По умолчанию это символ табуляции ( \t )
FIRSTROW [ = первая_строка ] Номер первой строки для копирования. По умолчанию 1. Этот параметр полезно использовать, если вы хотите пропустить заголовочную информацию в файле данных.
FORMATFILE [ = форматный_файл ] Указывает путь доступа к форматному файлу
KEEPIDENTITY Указывает, что в импортируемых файлах данных присутствуют значения для колонки со свойством identity
KEEPNULLS Указывает, что в пустых колонках сохраняется значение null
KILOBYTES_PER_BATCH [ = число ] Указывает приблизительное количество килобайт на одну группу (пакетное задание), используемую при массовом копировании
LASTROW [ = последняя_строка ] Указывает последнюю строку для выполнения массового копирования. По умолчанию используется значение 0. Этот параметр полезно использовать, если вы хотите вставить только определенное количество строк
MAXERRORS [ = максимум_ошибок ] Указывает, сколько ошибок должно произойти, чтобы прекратить вставку. Значение по умолчанию равно 10
ORDER ( колонка [ASC | DESC] ) Задает, что данные в указанной колонке должны быть отсортированы в указанном порядке (по возрастанию или убыванию)
ROWS_PER_BATCH [ = строк_на_группу ] Указывает количество строк на одну группу (пакетное задание). Каждая группа копируется в виде одной транзакции. По умолчанию вставка всех строк файла данных выполняется как одна транзакция с использованием одной фиксации. Этот параметр может понадобиться, когда вам нужно выполнять массовые вставки, чтобы освобождать блокировки таблиц, когда идет обработка групп, что позволит выполнять другую обработку
ROWTERMINATOR [ = разделитель_строк ] Указывает разделитель строк для данных типа char и widechar. По умолчанию используется символ новой строки ( \n )
Использование BULK INSERT

Рассмотрим два примера использования оператора BULK INSERT.

В обоих примерах мы будем загружать данные из файла с символьными данными data.file (который использовали в предыдущих примерах) в таблицу Customers базы данных Northwind.

Примечание.Напомним, что оператор BULK INSERT можно использовать только для вставки данных в базу данных; его нельзя использовать для извлечения данных. А поскольку оператор BULK INSERT не дает такого разнообразия режимов, как программа BCP, то мы приводим здесь только два примера.

Для загрузки данных в базу данных используйте следующий оператор T-SQL:

BULK INSERT Northwind..Customers FROM 'C:\data.file'
WITH
    (
    DATAFILETYPE = 'char'
    )
GO

Вы можете добавлять любое количество параметров. В следующем примере используется большее количество необязательных параметров:

BULK INSERT Northwind..Customers FROM 'C:\data.file'
WITH
    (
    BATCHSIZE = 5,
    CHECK_CONSTRAINTS,
    DATAFILETYPE = 'char',
    FIELDTERMINATOR = '\t',
    FIRSTROW = 5,
    LASTROW = 20,
    TABLOCK
    )

Этот оператор будет загружать из файла данных только строки 5-20. Указывается, что разделителем полей будет символ табуляции (несмотря на то, что он используется по умолчанию). В этом примере также указано, что во время процесса массовой вставки будут проверяться ограничения, а также задается блокировка таблицы на период загрузки. Транзакции, выполняющие загрузку, будут выполняться группами по пять строк.