После создания вашей базы данных и таблиц базы данных вы можете переходить к загрузке ваших данных в эту базу. Имеется несколько методов загрузки данных в базу данных; выбираемый вами метод зависит от типа источника ваших данных, от вида обработки, которая будет выполняться с данными, и от того, куда будут загружаться данные. В этой главе мы рассмотрим следующие методы загрузки в базу данных:
Каждый из этих методов обладает различными возможностями и характеристиками. Вы обязательно найдете хотя бы один метод, отвечающий вашим требованиям.
BULK INSERT. Эти параметры базы данных определяют, как выполняется массовое копирование. Эти параметры должны быть заданы до начала операций загрузки данных.Для вас могут оказаться полезными следующие дополнительные операции:
В этом разделе мы рассмотрим три параметра конфигурирования, которые обычно используются для повышения производительности операций загрузки. Два из этих трех параметров влияют на журнальное протоколирование во время операций массового копирования и третий параметр влияет на блокировку. Массовое копирование – это операция, при которой данные копируются большими порциями; копирование данных большими порциями является наиболее эффективным способом для воспроизведения данных.
SQL Server использует достаточно сложный механизм протоколирования, чтобы исключить потери данных в случае отказа системы. Журнальное протоколирование имеет важное значение для целостности данных в системе, но оно может существенно увеличивать нагрузку на систему. Вы можете снижать эту нагрузку за счет уменьшения количества протоколируемых данных во время массовых загрузок.
По умолчанию все операции вставки в базу данных полностью протоколируются, что позволяет выполнить восстановление и откат транзакций в случае отказа системы. Отключая полное протоколирование массового копирования (которое выполняется с помощью программы BULK INSERT или оператора SELECT...INTO ), вы можете снизить количество протоколируемых данных, но при этом будут поддерживаться только операции отката. Это повысит производительность резервного копирования, но потребует повторного запуска всего процесса загрузки в базу данных в случае отказа системы, поскольку не будет выполняться журнальное протоколирование, которое обычно используется для восстановления базы данных. Этот вариант относится к переходным таблицам, только если вы загружаете эти таблицы с помощью описанных выше методов массового копирования.
Полное протоколирование этих операций массового копирования отключается при выполнении всех следующих условий:
SELECT INTO/BULKCOPY задано значение TRUE. Вот синтаксис этой команды с использованием хранимой процедуры sp_dboption:exec sp_dboption имя_базы_данных, "select into/bulkcopy", TRUE
TABLOCK. (Более подробную информацию по этой подсказке см. далее в разделе "Необязательные параметры".) Если для таблицы, в которую загружаются данные, определены индексы, то SQL Server не требует от вас указания подсказки TABLOCK.Еще один параметр базы данных – trunc. log on chkpt – отключает сохранение журнальных записей, когда для этого параметра задано значение TRUE. В этом случае происходит усечение журнала транзакций каждый раз, как встречается контрольная точка. Это повышает производительность массового копирования, но означает, что вы не получите ни повторного выполнения, ни отката в случае отказа системы.
trunc. log on chkpt (задав для него значение TRUE ), то вам следует делать это, только если вы первоначально загрузили данные в базу данных. Полное отключение протоколирования влияет на всю базу данных и может сделать систему невосстанавливаемой. Таким образом, этот параметр никогда не следует использовать в TRUE для параметра trunc. log on chkpt, не забудьте отключить его, когда закончите операцию массовой загрузки.Чтобы задать этот параметр с помощью хранимой процедуры, используйте sp_dboption со следующими параметрами:
exec sp_dboption имя_базы_данных, "trunc. log on chkpt", TRUE
NULL или NOT NULL. Флажок
(рис 24.1) Вкладка Options (Параметры) окна Properties (Свойства) базы данных
Вы можете также повысить производительность массового копирования путем активизации параметра table lock on bulk load (блокировка таблицы при массовой загрузке). Этот параметр позволяет вам использовать для операции массового копирования одну табличную блокировку вместо нескольких блокировок по строкам. Значение параметра table lock on bulk load задается с помощью хранимой процедуры sp_tableoption со следующими параметрами:
exec sp_tableoption "имя_таблицы", "table lock on bulk load", TRUE
(Не забудьте восстановить в исходное состояние параметр trunc. log on chkpt после завершения загрузки.) Поскольку параметр table lock on bulk load влияет на режим блокировки данной таблицы только во время массовой загрузки, то если вы не выполняете массовую загрузку, никакого ухудшения производительности не происходит.
table lock on bulk loadv, вы должны использовать подсказку TABLOCK.С помощью
BCP – это исполняемая из командной строки программа, которая вызывается из окна приглашения на ввод команды (окна командной строки). Для
bcp {[[имя_базы_данных.][владелец].]{имя_таблицы | имя_представления} | "запрос"}
{in | out | queryout | format} файл_данных
[-m максимум_ошибок] [-f форматный_файл] [-e файл_ошибок]
[-F первая_строка] [-L последняя_строка] [-b размер_группы]
[-n] [-c] [-w] [-N] [-V (60 | 65 | 70)] [-6]
[-q] [-C кодовая_страница] [-t ограничитель_полей] [-r разделитель_строк]
[-i входной_файл] [-o выходной_файл] [-a размер_пакета]
[-S имя_сервера[\имя_экземпляра]] [-U login_id] [-P пароль]
[-T] [-v] [-R] [-k] [-E] [-h "подсказка [,...n]"]
Обязательные параметры указывают, в частности, местоположение для извлечения данных и местоположение для вставки данных. Как уже говорилось, с помощью
Вы можете указывать таблицу или представление, используемые в операции массового копирования, одним из двух способов. Во-первых, вы можете использовать параметр определение_таблицы/представления. Самое простое определение состоит из имени таблицы или представления. Как показано выше в формате этой команды, вы можете задавать имя базы данных, где находится указанная таблица или представление, и/или владельца таблицы или представления. Если имя базы данных не указано, то это принятая по умолчанию база данных, указанная в учетной записи подключения (login) данного пользователя. (Об определении пользователя см. главу 34.)
В качестве альтернативного способа вы можете указывать таблицу или представление с помощью запроса. Используя этот способ, вы указываете, какие данные будут извлекаться из этой таблицы или представления. (Чтобы указать таблицу или представление для извлечения или вставки данных можно использовать параметр определение_таблицы/представления. Этот запрос заключается в кавычки и может состоять из оператора SELECT с предложениями, такими как ORDER BY. Если вы задаете определение запроса, вы должны также задать параметр queryout (см. табл. 24.1).
Местоположение файла данных, используемого в операции массового копирования, указывается параметром файл_данных. Это должен быть соответствующий путь доступа.
И наконец, вы должны задать один или несколько параметров, перечисленных в табл. 24.1.
| Параметр | Описание |
|---|---|
In (В базу данных) |
Указывает, что массовое копирование будет выполняться из файла данных в таблицу или представление базы данных SQL Server |
Out (Из базы данных) |
Указывает, что массовое копирование будет выполняться из таблицы или представления базы данных SQL Server в файл данных |
Queryout (Извлечение с помощью запроса) |
Указывает, что данные будут извлекаться из базы данных SQL Server с помощью определенного запроса. Затем операция массового копирования будет копировать данные, выбранные с помощью этого запроса, в файл данных |
Format (Формат) |
Указывает, что в дополнение к операции массового копирования программа -n, -c, -w, -6 или -N ) и ограничители (разделители) таблицы или представления. Параметр format должен использоваться в сочетании с опцией -f. Форматный файл позволяет вам сохранять определения программы |
Вы можете использовать необязательные (дополнительные) параметры, перечисленые в табл. 24.2, для модифицирования работы программы
| Параметр | Описание |
|---|---|
-a размер_пакета |
Указывает количество байтов в сетевом пакете, передаваемом между клиентом и сервером |
-b размер_группы |
Указывает количество строк, которое нужно включить в группу (пакетное задание). Каждая группа копируется как одна транзакция. По умолчанию все строки файла данных копируются как одна группа с использованием одной фиксации. Этот параметр может понадобиться, когда вам нужно выполнять массовые вставки, чтобы освобождать блокировки таблиц, когда идет обработка таких групп, что позволит выполнять другую обработку |
-c |
Указывает, что |
-e файл_ошибок |
Указывает путь доступа к |
-f форматный_файл |
Указывает путь доступа к форматному файлу, который ранее использовался программой format, который описан выше. При использовании форматного файла другие параметры форматирования можно не указывать |
-h "подсказка [,.n]" |
Указывает подсказки, которые будут использоваться при массовом копировании. Это могут быть следующие подсказки:ORDER (колонка [. Указывает на сортировку данных в указанной колонкеROWS_PER_BATCH = число. Указывает количество строк на одну группу (пакетное задание). Этот параметр аналогичен -b, но его не следует использовать в сочетании с -b. Параметр -b задает передачу указанной группы строк в SQL Server в виде одной транзакции. Если -b не указан, то весь файл данных передается на SQL Server в виде одной транзакции, а параметр ROWS_PER_BATCH используется для того, чтобы помочь SQL Server оценить объем нагрузки. Эта информация используется для оптимизации нагрузки внутренним образомKILOBYTES_PER_BATCH = число. Указывает приблизительное количество килобайт на одну группу. Этот параметр аналогичен -b, но для указания размера группы используются килобайты, а не количество строкTABLOCK. Указывает, что в течение массовой загрузки будет использоваться блокировка на уровне таблицы. Этот метод существенно повышает производительность загрузки за счет снижения конкуренции блокировок по данной таблицеCHECK_CONSTRAINTS. Указывает на необходимость проверки ограничений во время массовой загрузки. По умолчанию ограничения игнорируются |
-i входной_файл |
Указывает имя файла ответов. Файл ответов содержит ответы на вопросы, задаваемые программой |
-k |
Указывает, что в пустые колонки заносятся значения null, а не значения по умолчанию |
-m максимум_ошибок |
Указывает, сколько ошибок должно произойти, чтобы 10 |
-n |
Указывает, что |
-o выходной_файл |
Указывает выходной файл, в который поступает |
-q |
Указывает, что для имен таблицы и представления требуются заключенные в кавычки идентификаторы, содержащие символы, отличные от стандарта ANSI, такие как пробел |
-r разделитель_строк |
Указывает символ окончания строк. По умолчанию используется символ новой строки |
-t ограничитель_полей |
Указывает ограничитель полей. По умолчанию используется символ табуляции (tab) |
-v |
Выводит номер версии и информацию об авторских правах программы |
-w |
Указывает, что |
-C кодовая_страница |
Указывает кодовую страницу данных в файле данных |
-E |
Указывает, что копируемый файл содержит значения для идентификации колонок |
-F первая_строка |
Указывает первую строку, с которой начинается массовое копирование. Если этот параметр не указан, по первой строкой будет строка 1. Этот параметр полезно использовать, если вы хотите пропустить заголовочную информацию в файле данных |
-L последняя_строка |
Указывает последнюю строку для выполнения массового копирования. Принятое по умолчанию значение 0 указывает, что последней строкой для копирования является последняя строка файла данных. Этот параметр полезно использовать, если вы хотите копировать только определенное количество строк |
-N |
Указывает, что |
-P пароль |
Указывает пароль для идентификатора учетной записи подключения (login ID), который используется в параметре -U. |
-R |
Указывает, что для денежных единиц, даты и времени используется региональный формат клиентской системы |
-S имя_сервера |
Указывает имя сервера, на который выполняется копирование |
-T |
Указывает, что используется доверяемое соединение. Если используется этот параметр, то переменные login_id и пароль не требуются; используются данные учетной записи пользователя сети |
-U login_id |
Указывает login ID пользователя (идентификатор учетной записи подключения), под которым будет выполняться копирование данных |
-V 60 | 65 | 70 |
Выполняет массовое копирование с использованием типов данных из более ранней версии SQL Server. Этот параметр следует использовать в сочетании с параметрами -c и -n |
-6 |
Указывает, что |
Как видно из этой таблицы, для использования возможностей
В этом разделе мы рассмотрим несколько примеров использования
Вы можете использовать -n, -c, -w или -N. Если не указан ни один из этих параметров, то программа
Использование
bcp Northwind.dbo.Customers in data2.file -e err.file -Usa
Затем у вас будет запрошен пароль. Введите пароль системного администратора (sa).
Далее программа
Enter the file storage type of field CustomerID [nchar]: char (Введите тип файлового хранения для поля ...) Enter prefix-length of field CustomerID [1]: 0 (Введите длину префикса поля ...) Enter length of field CustomerID [26]: 5 (Введите длину поля ...) Enter field terminator [none]: , (Введите ограничитель поля ...) Enter the file storage type of field CompanyName [nvarchar]: char Enter prefix-length of field CompanyName [1]: 0 Enter length of field CompanyName [189]: 40 Enter field terminator [none]: , Enter the file storage type of field ContactName [nvarchar]: char Enter prefix-length of field ContactName [1]: 0 Enter length of field ContactName [143]: 30 Enter field terminator [none]: , Enter the file storage type of field ContactTitle [nvarchar]: char Enter prefix-length of field ContactTitle [1]: 0 Enter length of field ContactTitle [143]: 30 Enter field terminator [none]: , Enter the file storage type of field Address [nvarchar]: char Enter prefix-length of field Address [1]: 0 Enter length of field Address [283]: 60 Enter field terminator [none]: , Enter the file storage type of field City [nvarchar]: char Enter prefix-length of field City [1]: 0 Enter length of field City [73]: 15 Enter field terminator [none]: , Enter the file storage type of field Region [nvarchar]: char Enter prefix-length of field Region [1]: 0 Enter length of field Region [73]: 15 Enter field terminator [none]: , Enter the file storage type of field PostalCode [nvarchar]: char Enter prefix-length of field PostalCode [1]: 0 Enter length of field PostalCode [49]: 10 Enter field terminator [none]: , Enter the file storage type of field Country [nvarchar]: char Enter prefix-length of field Country [1]: 0 Enter length of field Country [73]: 15 Enter field terminator [none]: , Enter the file storage type of field Phone [nvarchar]: char Enter prefix-length of field Phone [1]: 0 Enter length of field Phone [115]: 24 Enter field terminator [none]: , Enter the file storage type of field Fax [nvarchar]: char Enter prefix-length of field Fax [1]: 0 Enter length of field Fax [115]: 24 Enter field terminator [none]: , Do you want to save this format information in a file? [Y/n]: Y (Хотите сохранить эту информацию о формате в файле?) Host filename [bcp.fmt]: data.fmt (Имя файла) Starting copy... (Начало копирования) SQLState = S1000, NativeError = 0 Error = [Microsoft][ODBC SQL Server Driver] Unexpected EOF encountered in BCP data-file (Ошибка = ... непредвиденный конец файла в файле данных BCP) 5 rows copied. (Скопировано 5 строк) Network packet size (bytes): 4096 (Размер сетевого пакета [в байтах]) Clock Time (ms.): total 51 Avg 10 (98.04 rows per sec.) (Время (мс): всего 51 В среднем 10 (98.04 строк в сек.)
Как видно из данного примера, вы должны знать эти значения, прежде чем начнете копирование. Когда программа
Как уже говорилось, вам будет намного проще использовать -c. Кроме того, использование параметра -c позволяет выполнять
bcp Northwind.dbo.Customers in data.file -e err.fil -c -Usa
Поскольку параметр -c указывает символьные данные, вам не нужно задавать длину полей и длину префиксов. Если предположить, что вы создали файл data.file с 25 строками данных, разделенных символом tab в соответствии с колонками таблицы Customers, и ввели пароль sa, то соответствующий сеанс будет иметь следующую форму: (Размер вашего сетевого пакета и время работы, возможно, будут отличаться.)
Starting copy... 25 rows copied. Network packet size (bytes): 4096 Clock Time (ms.): total 80 Avg 3 (312.50 rows per sec.)
В этом примере направление копирования было указано параметром in, т.е. данные копировались в базу данных. Всегда имеет смысл указывать
В нашем первом примере раздела "Использование storage type (тип хранения), (длина префикса), field length (длина поля) и field terminator (-f (format), как это показано ниже:
bcp Northwind.dbo.Customers in data2.file -e err.fil -f data.fmt -L 5 -Usa
В предположении, что вы ввели пароль sa и создали data2.file, сеанс будет иметь следующую форму:
Starting copy... 5 rows copied. Network packet size (bytes): 4096 Clock Time (ms.): total 50 Avg 10 (100.00 rows per sec.)
В дополнение к параметру -f в данном примере включен параметр -L. Этот параметр указывает последнюю строку для копирования из входного файла. В данном примере последней обрабатываемой строкой была пятая строка. В результате здесь не появится сообщение об ошибке EOF (конец файла), которое мы видели в предыдущем примере.
Использование
bcp Northwind.dbo.Customers out dataout.dat -e err.fil -U sa
После ввода этой команды и пароля sa начнется выполнение сеанса. (Ввод пользователя показан полужирным шрифтом.)
Enter the file storage type of field CustomerID [nchar]: char Enter prefix-length of field CustomerID [1]: 0 Enter length of field CustomerID [26]: Enter field terminator [none]: , Enter the file storage type of field CompanyName [nvarchar]: char Enter prefix-length of field CompanyName [1]: 0 Enter length of field CompanyName [189]: Enter field terminator [none]: , Enter the file storage type of field ContactName [nvarchar]: char Enter prefix-length of field ContactName [1]: 0 Enter length of field ContactName [143]: Enter field terminator [none]: , Enter the file storage type of field ContactTitle [nvarchar]: char Enter prefix-length of field ContactTitle [1]: 0 Enter length of field ContactTitle [143]: Enter field terminator [none]: , Enter the file storage type of field Address [nvarchar]: char Enter prefix-length of field Address [1]: 0 Enter length of field Address [283]: Enter field terminator [none]: , Enter the file storage type of field City [nvarchar]: char Enter prefix-length of field City [1]: 0 Enter length of field City [73]: Enter field terminator [none]: , Enter the file storage type of field Region [nvarchar]: char Enter prefix-length of field Region [1]: 0 Enter length of field Region [73]: Enter field terminator [none]: , Enter the file storage type of field PostalCode [nvarchar]: char Enter prefix-length of field PostalCode [1]: 0 Enter length of field PostalCode [49]: Enter field terminator [none]: , Enter the file storage type of field Country [nvarchar]: char Enter prefix-length of field Country [1]: 0 Enter length of field Country [73]: Enter field terminator [none]: , Enter the file storage type of field Phone [nvarchar]: char Enter prefix-length of field Phone [1]: 0 Enter length of field Phone [115]: Enter field terminator [none]: , Enter the file storage type of field Fax [nvarchar]: char Enter prefix-length of field Fax [1]: 0 Enter length of field Fax [115]: Enter field terminator [none]: , Do you want to save this format information in a file? [Y/n]: n Host filename [bcp.fmt]: Starting copy... 96 rows copied. Network packet size (bytes): 4096 Clock Time (ms.): total 10 Avg 0 (9600.00 rows per sec.)
В этом интерактивном сеансе
Чтобы создать более удобный для -c, как это показано ниже:
bcp Northwind.dbo.Customers out dataout.dat -e err.fil -c -U sa
После ввода этой команды и пароля sa начнется выполнение сеанса, как показано ниже:
Starting copy... 96 rows copied. Network packet size (bytes): 4096 Clock Time (ms.): total 1 Avg 0 (96000.00 rows per sec.)
В нашем последнем примере для извлечения данных используется параметр queryout. Это параметр позволяет вам задавать запрос при копировании данных из базы данных SQL Server. С помощью этого запроса происходит выбор определенных данных и копирование только этих данных. Параметр queryout достаточно прост для использования – просто не забывайте указывать запрос в кавычках, как это показано ниже:
bcp "SELECT CustomerID, CompanyName FROM Northwind..Customers" queryout dataout.dat -e err.fil -c -U sa Как обычно, введите пароль sa; сеанс будет показан в следующей форме: Starting copy... 96 rows copied. Network packet size (bytes): 4096 Clock Time (ms.): total 1 Avg 0 (96000.00 rows per sec.)
Результатом этого запроса будет файл данных с разделителями в виде символов табуляции и признаками конца строк; этот файл состоит из двух колонок: CustomerID и CompanyName. Это способ полезно использовать, если вы хотите извлечь только определенные колонки или строки базы данных.
Оператор T-SQL BULK INSERT аналогичен программе BULK INSERT нельзя использовать для извлечения данных из баз данных SQL Server. Это ограничение уменьшает его функциональные возможности, но поскольку оператор BULK INSERT выполняется как поток внутри SQL Server, это устраняет необходимость передачи данных из одной программы в другую, что повышает производительность при загрузке данных. Таким образом, оператор BULK INSERT загружает данные более эффективно, чем программа
Как и 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, аналогичны параметрам программы
| Необязательный параметр | Описание |
|---|---|
BATCHSIZE = размер |
Указывает количество строк в группе (пакетном задании). Каждая группа обрабатывается как одна транзакция |
CHECK_CONSTRAINTS |
Указывает на то, что будет выполняться проверка ограничений. По умолчанию ограничения игнорируются. |
CODEPAGE [ = ' |
Указывает кодовую страницу данных в файле данных. Этот параметр полезно использовать только с типами данных char, varchar и text |
ATAFILETYPE [ = 'char' | 'native' | ' |
Указывает тип данных в файле данных; по умолчанию это тип char. Другие типы: native (собственные типы данных базы данных), (символы Unicode) и widenative (то же, что и native, но типы char, varchar и text сохраняются как Unicode) |
FIELDTERMINATOR [ = ограничитель_полей ] |
Указывает ограничитель полей, используемый с типами данных char и . По умолчанию это символ табуляции ( \t ) |
FIRSTROW [ = первая_строка ] |
Номер первой строки для копирования. По умолчанию 1. Этот параметр полезно использовать, если вы хотите пропустить заголовочную информацию в файле данных. |
FORMATFILE [ = форматный_файл ] |
Указывает путь доступа к форматному файлу |
KEEPIDENTITY |
Указывает, что в импортируемых файлах данных присутствуют значения для колонки со свойством identity |
KEEPNULLS |
Указывает, что в пустых колонках сохраняется значение null |
KILOBYTES_PER_BATCH [ = число ] |
Указывает приблизительное количество килобайт на одну группу (пакетное задание), используемую при массовом копировании |
LASTROW [ = последняя_строка ] |
Указывает последнюю строку для выполнения массового копирования. По умолчанию используется значение 0. Этот параметр полезно использовать, если вы хотите вставить только определенное количество строк |
MAXERRORS [ = максимум_ошибок ] |
Указывает, сколько ошибок должно произойти, чтобы прекратить вставку. Значение по умолчанию равно 10 |
ORDER ( колонка [ |
Задает, что данные в указанной колонке должны быть отсортированы в указанном порядке (по возрастанию или убыванию) |
ROWS_PER_BATCH [ = строк_на_группу ] |
Указывает количество строк на одну группу (пакетное задание). Каждая группа копируется в виде одной транзакции. По умолчанию вставка всех строк файла данных выполняется как одна транзакция с использованием одной фиксации. Этот параметр может понадобиться, когда вам нужно выполнять массовые вставки, чтобы освобождать блокировки таблиц, когда идет обработка групп, что позволит выполнять другую обработку |
ROWTERMINATOR [ = разделитель_строк ] |
Указывает разделитель строк для данных типа char и . По умолчанию используется символ новой строки ( \n ) |
Рассмотрим два примера использования оператора BULK INSERT.
В обоих примерах мы будем загружать данные из файла с символьными данными data.file (который использовали в предыдущих примерах) в таблицу Customers базы данных Northwind.
BULK INSERT можно использовать только для вставки данных в базу данных; его нельзя использовать для извлечения данных. А поскольку оператор BULK INSERT не дает такого разнообразия режимов, как программа Для загрузки данных в базу данных используйте следующий оператор 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. Указывается, что
Средство
Вы можете использовать Import Wizard для импорта данных в базу данных из различных источников данных. В отличие от программы BULK INSERT мастер Import Wizard может импортировать данные из источников, отличных от файлов данных. Чтобы использовать Import Wizard, выполните следующие шаги.
(рис 24.2) Начальное окно мастера Data Transformation Services Import/Export Wizard
(рис 24.3) Окно Choose а Data Source (Выберите источник данных)Здесь вы можете выбрать источник данных из раскрывающегося списка Source (Источник). На рис. 24.3 показан выбранный тип
(рис 24.4) Окно Select file format (Выбор формата файла)
(рис 24.6) Окно Specify Column Delimiter (Указание ограничителя колонок)(рис 24.5) Окно Choose a Destination (Выбор получателя данных)
(рис 24.7) Окно Select Source Tables and Views (Выбор исходных таблиц и представлений)null (NOT NULL to NULL, NULL to NOT NULL).
(рис 24.9) Вкладка Column Mappings (Отображение колонок) диалогового окна Column Mappings and Transformations (Отображение и преобразование колонок)(рис 24.8) Вкладка Transformations диалогового окна Column Mappings and Transformations
(рис 24.11) Окно Save, schedule, and replicate package (Сохранение, планирование запуска и репликация пакета)(рис 24.10) Окно Completing the DTS Import Wizard (Завершение работы мастера импорта DTS)Как видно из описания, мастер BULK INSERT в .sql-файле.
(рис 24.12) Окно Choose a Destination (Выбор получателя данных)
Вы можете использовать мастер Export Wizard для экспорта данных из базы данных во внешние хранилища данных. В отличие от программы
(рис 24.13) Начальное окно Data Transformation Services Import/Export Wizard
(рис 24.14) Окно Choose a Data Source (Выбор источника данных)Если щелкнуть на кнопке выбора Use a query to specify the data to transfer (Использовать запрос для указания данных, подлежащих копированию) и затем щелкнуть на кнопке Next, то появится окно Type

(рис 24.16) Окно Choose a Destination (Выбор получателя)(рис 24.15) Окно Specify Table Copy or Query (Копия таблицы или запрос)
(рис 24.17) Окно Type SQL Statement (введите оператор SQL))Если щелкнуть на кнопке выбора Copy table(s) and view(s) from the
(рис 24.18) Окно Select destination file formatОба мастера – Import Wizard и Export Wizard – просты для использования и конфигурирования; они позволяют упростить работу, временами сопряженную с трудностями при использовании других средств. Но следует помнить, что если вам требуется повторное выполнение этих операций, то стоит приложить дополнительные усилия для их реализации в виде сценария. Вы можете создать сценарий, в который входит оператор SQL BULK INSERT, для выполнения нужной операции импорта, или использовать оператор SELECT, где выходные результаты перенаправлены в файл данных, для выполнения операции экспорта.

(рис 24.20) Окно Save, schedule, and replicate package(рис 24.19) Окно Completing the DTS Export Wizard
(рис 24.21) Окно Executing Package
Переходные таблицы – это временные таблицы, которые вы создаете для загрузки данных в SQL Server, для обработки и манипулирования этими данными, а также для копирования этих данных в соответствующую таблицу или таблицы в базе данных. В этом разделе вы узнаете, как и когда использовать
Возможность обработки данных во время процесса загрузки в
В этом разделе мы рассмотрим три примера использования
Рассмотрим таблицу "рынка" данных (
(рис 24.22) Использование переходных таблиц для слияния
Следствием нашего первого примера является сценарий, при котором одна таблица загружается в несколько таблиц рынка данных, что может потребоваться в целях упорядочивания. Эту задачу можно легко выполнить путем копирования данных в переходную таблицу и использования двух запросов для загрузки переходной таблицы в таблицы рынка данных (рис. 24.23).
(рис 24.23) Использование переходных таблиц для разделения данных
Вы можете загружать уникальные значения в таблицу путем массового копирования данных для загрузки в переходную таблицу и последующего использования оператора T-SQL для вставки данных в основную таблицу, только если этих данных еще нет в таблице. Эта возможность полезна в тех случаях, когда вы загружаете данные, которые могут нарушать некоторые деловые правила. Для копирования уникальных значений из переходной таблицы используйте оператор NOT IN, как это показано ниже:
INSERT INTO table ( columnA, columnB )
SELECT columnA, columnB
FROM staging_table
WHERE columnA NOT IN ( SELECT columnA
FROM table )
Этот несколько усложненный оператор SQL просто загружает из переходной таблицы в основную таблицу строки, которые содержат в колонке columnA значение, не совпадающее со значением той же колонки в основной таблице, что позволяет избежать вставки дублированных значений.
Использование оператора SELECT...INTO на самом деле не является методом загрузки базы данных; это способ создания новых таблиц из существующих таблиц или SELECT...INTO нельзя использовать для заполнения существующей таблицы.
Примечание. Чтобы можно было использовать оператор SELECT...INTO, для параметра базы данных select into/bulkcopy должно быть задано значение TRUE. Чтобы задать этот параметр, используйте следующий оператор T-SQL:
exec sp_dboption <имя_базы_данных>, "select into/bulkcopy", TRUE
Ниже приводится синтаксис оператора SELECT...INTO:
SELECT <список_колонок> INTO <имя_новой_таблицы> <предложение_для_select>
Переменная предложение_для_select указывает операторы, которые обычно уточняют оператор SELECT, такие как FROM и WHERE. Оператор SELECT...INTO легко использовать, как показано в следующем примере:
exec sp_dboption "example", "select into/bulkcopy", TRUE
GO
SELECT order_id,
contact_id,
item_id,
item_description,
amount INTO newsales
FROM stage
GO
exec sp_dboption "example", "select into/bulkcopy", FALSE
GO
В данном случае указана база данных "example" и создаваемая таблица newsales. Данные извлекаются из таблицы
В этой главе вы узнали, как загружать базу данных SQL Server с помощью программы BULK INSERT и средств SELECT...INTO. Эти средства и методы, несомненно, помогут вам, поскольку загрузка базы данных является одной из основных задач для DBA. В главе 25 вы узнаете о компонентах Distributed Transaction Coordinator и Microsoft Transaction Server.
После создания вашей базы данных и таблиц базы данных вы можете переходить к загрузке ваших данных в эту базу. Имеется несколько методов загрузки данных в базу данных; выбираемый вами метод зависит от типа источника ваших данных, от вида обработки, которая будет выполняться с данными, и от того, куда будут загружаться данные. В этой главе мы рассмотрим следующие методы загрузки в базу данных:
Каждый из этих методов обладает различными возможностями и характеристиками. Вы обязательно найдете хотя бы один метод, отвечающий вашим требованиям.
BULK INSERT. Эти параметры базы данных определяют, как выполняется массовое копирование. Эти параметры должны быть заданы до начала операций загрузки данных.Для вас могут оказаться полезными следующие дополнительные операции:
В этом разделе мы рассмотрим три параметра конфигурирования, которые обычно используются для повышения производительности операций загрузки. Два из этих трех параметров влияют на журнальное протоколирование во время операций массового копирования и третий параметр влияет на блокировку. Массовое копирование – это операция, при которой данные копируются большими порциями; копирование данных большими порциями является наиболее эффективным способом для воспроизведения данных.
SQL Server использует достаточно сложный механизм протоколирования, чтобы исключить потери данных в случае отказа системы. Журнальное протоколирование имеет важное значение для целостности данных в системе, но оно может существенно увеличивать нагрузку на систему. Вы можете снижать эту нагрузку за счет уменьшения количества протоколируемых данных во время массовых загрузок.
По умолчанию все операции вставки в базу данных полностью протоколируются, что позволяет выполнить восстановление и откат транзакций в случае отказа системы. Отключая полное протоколирование массового копирования (которое выполняется с помощью программы BULK INSERT или оператора SELECT...INTO ), вы можете снизить количество протоколируемых данных, но при этом будут поддерживаться только операции отката. Это повысит производительность резервного копирования, но потребует повторного запуска всего процесса загрузки в базу данных в случае отказа системы, поскольку не будет выполняться журнальное протоколирование, которое обычно используется для восстановления базы данных. Этот вариант относится к переходным таблицам, только если вы загружаете эти таблицы с помощью описанных выше методов массового копирования.
Полное протоколирование этих операций массового копирования отключается при выполнении всех следующих условий:
SELECT INTO/BULKCOPY задано значение TRUE. Вот синтаксис этой команды с использованием хранимой процедуры sp_dboption:exec sp_dboption имя_базы_данных, "select into/bulkcopy", TRUE
TABLOCK. (Более подробную информацию по этой подсказке см. далее в разделе "Необязательные параметры".) Если для таблицы, в которую загружаются данные, определены индексы, то SQL Server не требует от вас указания подсказки TABLOCK.Еще один параметр базы данных – trunc. log on chkpt – отключает сохранение журнальных записей, когда для этого параметра задано значение TRUE. В этом случае происходит усечение журнала транзакций каждый раз, как встречается контрольная точка. Это повышает производительность массового копирования, но означает, что вы не получите ни повторного выполнения, ни отката в случае отказа системы.
trunc. log on chkpt (задав для него значение TRUE ), то вам следует делать это, только если вы первоначально загрузили данные в базу данных. Полное отключение протоколирования влияет на всю базу данных и может сделать систему невосстанавливаемой. Таким образом, этот параметр никогда не следует использовать в TRUE для параметра trunc. log on chkpt, не забудьте отключить его, когда закончите операцию массовой загрузки.Чтобы задать этот параметр с помощью хранимой процедуры, используйте sp_dboption со следующими параметрами:
exec sp_dboption имя_базы_данных, "trunc. log on chkpt", TRUE
NULL или NOT NULL. Флажок
(рис 24.1) Вкладка Options (Параметры) окна Properties (Свойства) базы данных
Вы можете также повысить производительность массового копирования путем активизации параметра table lock on bulk load (блокировка таблицы при массовой загрузке). Этот параметр позволяет вам использовать для операции массового копирования одну табличную блокировку вместо нескольких блокировок по строкам. Значение параметра table lock on bulk load задается с помощью хранимой процедуры sp_tableoption со следующими параметрами:
exec sp_tableoption "имя_таблицы", "table lock on bulk load", TRUE
(Не забудьте восстановить в исходное состояние параметр trunc. log on chkpt после завершения загрузки.) Поскольку параметр table lock on bulk load влияет на режим блокировки данной таблицы только во время массовой загрузки, то если вы не выполняете массовую загрузку, никакого ухудшения производительности не происходит.
table lock on bulk loadv, вы должны использовать подсказку TABLOCK.С помощью
BCP – это исполняемая из командной строки программа, которая вызывается из окна приглашения на ввод команды (окна командной строки). Для
bcp {[[имя_базы_данных.][владелец].]{имя_таблицы | имя_представления} | "запрос"}
{in | out | queryout | format} файл_данных
[-m максимум_ошибок] [-f форматный_файл] [-e файл_ошибок]
[-F первая_строка] [-L последняя_строка] [-b размер_группы]
[-n] [-c] [-w] [-N] [-V (60 | 65 | 70)] [-6]
[-q] [-C кодовая_страница] [-t ограничитель_полей] [-r разделитель_строк]
[-i входной_файл] [-o выходной_файл] [-a размер_пакета]
[-S имя_сервера[\имя_экземпляра]] [-U login_id] [-P пароль]
[-T] [-v] [-R] [-k] [-E] [-h "подсказка [,...n]"]
Обязательные параметры указывают, в частности, местоположение для извлечения данных и местоположение для вставки данных. Как уже говорилось, с помощью
Вы можете указывать таблицу или представление, используемые в операции массового копирования, одним из двух способов. Во-первых, вы можете использовать параметр определение_таблицы/представления. Самое простое определение состоит из имени таблицы или представления. Как показано выше в формате этой команды, вы можете задавать имя базы данных, где находится указанная таблица или представление, и/или владельца таблицы или представления. Если имя базы данных не указано, то это принятая по умолчанию база данных, указанная в учетной записи подключения (login) данного пользователя. (Об определении пользователя см. главу 34.)
В качестве альтернативного способа вы можете указывать таблицу или представление с помощью запроса. Используя этот способ, вы указываете, какие данные будут извлекаться из этой таблицы или представления. (Чтобы указать таблицу или представление для извлечения или вставки данных можно использовать параметр определение_таблицы/представления. Этот запрос заключается в кавычки и может состоять из оператора SELECT с предложениями, такими как ORDER BY. Если вы задаете определение запроса, вы должны также задать параметр queryout (см. табл. 24.1).
Местоположение файла данных, используемого в операции массового копирования, указывается параметром файл_данных. Это должен быть соответствующий путь доступа.
И наконец, вы должны задать один или несколько параметров, перечисленных в табл. 24.1.
| Параметр | Описание |
|---|---|
In (В базу данных) |
Указывает, что массовое копирование будет выполняться из файла данных в таблицу или представление базы данных SQL Server |
Out (Из базы данных) |
Указывает, что массовое копирование будет выполняться из таблицы или представления базы данных SQL Server в файл данных |
Queryout (Извлечение с помощью запроса) |
Указывает, что данные будут извлекаться из базы данных SQL Server с помощью определенного запроса. Затем операция массового копирования будет копировать данные, выбранные с помощью этого запроса, в файл данных |
Format (Формат) |
Указывает, что в дополнение к операции массового копирования программа -n, -c, -w, -6 или -N ) и ограничители (разделители) таблицы или представления. Параметр format должен использоваться в сочетании с опцией -f. Форматный файл позволяет вам сохранять определения программы |
Вы можете использовать необязательные (дополнительные) параметры, перечисленые в табл. 24.2, для модифицирования работы программы
| Параметр | Описание |
|---|---|
-a размер_пакета |
Указывает количество байтов в сетевом пакете, передаваемом между клиентом и сервером |
-b размер_группы |
Указывает количество строк, которое нужно включить в группу (пакетное задание). Каждая группа копируется как одна транзакция. По умолчанию все строки файла данных копируются как одна группа с использованием одной фиксации. Этот параметр может понадобиться, когда вам нужно выполнять массовые вставки, чтобы освобождать блокировки таблиц, когда идет обработка таких групп, что позволит выполнять другую обработку |
-c |
Указывает, что |
-e файл_ошибок |
Указывает путь доступа к |
-f форматный_файл |
Указывает путь доступа к форматному файлу, который ранее использовался программой format, который описан выше. При использовании форматного файла другие параметры форматирования можно не указывать |
-h "подсказка [,.n]" |
Указывает подсказки, которые будут использоваться при массовом копировании. Это могут быть следующие подсказки:ORDER (колонка [. Указывает на сортировку данных в указанной колонкеROWS_PER_BATCH = число. Указывает количество строк на одну группу (пакетное задание). Этот параметр аналогичен -b, но его не следует использовать в сочетании с -b. Параметр -b задает передачу указанной группы строк в SQL Server в виде одной транзакции. Если -b не указан, то весь файл данных передается на SQL Server в виде одной транзакции, а параметр ROWS_PER_BATCH используется для того, чтобы помочь SQL Server оценить объем нагрузки. Эта информация используется для оптимизации нагрузки внутренним образомKILOBYTES_PER_BATCH = число. Указывает приблизительное количество килобайт на одну группу. Этот параметр аналогичен -b, но для указания размера группы используются килобайты, а не количество строкTABLOCK. Указывает, что в течение массовой загрузки будет использоваться блокировка на уровне таблицы. Этот метод существенно повышает производительность загрузки за счет снижения конкуренции блокировок по данной таблицеCHECK_CONSTRAINTS. Указывает на необходимость проверки ограничений во время массовой загрузки. По умолчанию ограничения игнорируются |
-i входной_файл |
Указывает имя файла ответов. Файл ответов содержит ответы на вопросы, задаваемые программой |
-k |
Указывает, что в пустые колонки заносятся значения null, а не значения по умолчанию |
-m максимум_ошибок |
Указывает, сколько ошибок должно произойти, чтобы 10 |
-n |
Указывает, что |
-o выходной_файл |
Указывает выходной файл, в который поступает |
-q |
Указывает, что для имен таблицы и представления требуются заключенные в кавычки идентификаторы, содержащие символы, отличные от стандарта ANSI, такие как пробел |
-r разделитель_строк |
Указывает символ окончания строк. По умолчанию используется символ новой строки |
-t ограничитель_полей |
Указывает ограничитель полей. По умолчанию используется символ табуляции (tab) |
-v |
Выводит номер версии и информацию об авторских правах программы |
-w |
Указывает, что |
-C кодовая_страница |
Указывает кодовую страницу данных в файле данных |
-E |
Указывает, что копируемый файл содержит значения для идентификации колонок |
-F первая_строка |
Указывает первую строку, с которой начинается массовое копирование. Если этот параметр не указан, по первой строкой будет строка 1. Этот параметр полезно использовать, если вы хотите пропустить заголовочную информацию в файле данных |
-L последняя_строка |
Указывает последнюю строку для выполнения массового копирования. Принятое по умолчанию значение 0 указывает, что последней строкой для копирования является последняя строка файла данных. Этот параметр полезно использовать, если вы хотите копировать только определенное количество строк |
-N |
Указывает, что |
-P пароль |
Указывает пароль для идентификатора учетной записи подключения (login ID), который используется в параметре -U. |
-R |
Указывает, что для денежных единиц, даты и времени используется региональный формат клиентской системы |
-S имя_сервера |
Указывает имя сервера, на который выполняется копирование |
-T |
Указывает, что используется доверяемое соединение. Если используется этот параметр, то переменные login_id и пароль не требуются; используются данные учетной записи пользователя сети |
-U login_id |
Указывает login ID пользователя (идентификатор учетной записи подключения), под которым будет выполняться копирование данных |
-V 60 | 65 | 70 |
Выполняет массовое копирование с использованием типов данных из более ранней версии SQL Server. Этот параметр следует использовать в сочетании с параметрами -c и -n |
-6 |
Указывает, что |
Как видно из этой таблицы, для использования возможностей
В этом разделе мы рассмотрим несколько примеров использования
Вы можете использовать -n, -c, -w или -N. Если не указан ни один из этих параметров, то программа
Использование
bcp Northwind.dbo.Customers in data2.file -e err.file -Usa
Затем у вас будет запрошен пароль. Введите пароль системного администратора (sa).
Далее программа
Enter the file storage type of field CustomerID [nchar]: char (Введите тип файлового хранения для поля ...) Enter prefix-length of field CustomerID [1]: 0 (Введите длину префикса поля ...) Enter length of field CustomerID [26]: 5 (Введите длину поля ...) Enter field terminator [none]: , (Введите ограничитель поля ...) Enter the file storage type of field CompanyName [nvarchar]: char Enter prefix-length of field CompanyName [1]: 0 Enter length of field CompanyName [189]: 40 Enter field terminator [none]: , Enter the file storage type of field ContactName [nvarchar]: char Enter prefix-length of field ContactName [1]: 0 Enter length of field ContactName [143]: 30 Enter field terminator [none]: , Enter the file storage type of field ContactTitle [nvarchar]: char Enter prefix-length of field ContactTitle [1]: 0 Enter length of field ContactTitle [143]: 30 Enter field terminator [none]: , Enter the file storage type of field Address [nvarchar]: char Enter prefix-length of field Address [1]: 0 Enter length of field Address [283]: 60 Enter field terminator [none]: , Enter the file storage type of field City [nvarchar]: char Enter prefix-length of field City [1]: 0 Enter length of field City [73]: 15 Enter field terminator [none]: , Enter the file storage type of field Region [nvarchar]: char Enter prefix-length of field Region [1]: 0 Enter length of field Region [73]: 15 Enter field terminator [none]: , Enter the file storage type of field PostalCode [nvarchar]: char Enter prefix-length of field PostalCode [1]: 0 Enter length of field PostalCode [49]: 10 Enter field terminator [none]: , Enter the file storage type of field Country [nvarchar]: char Enter prefix-length of field Country [1]: 0 Enter length of field Country [73]: 15 Enter field terminator [none]: , Enter the file storage type of field Phone [nvarchar]: char Enter prefix-length of field Phone [1]: 0 Enter length of field Phone [115]: 24 Enter field terminator [none]: , Enter the file storage type of field Fax [nvarchar]: char Enter prefix-length of field Fax [1]: 0 Enter length of field Fax [115]: 24 Enter field terminator [none]: , Do you want to save this format information in a file? [Y/n]: Y (Хотите сохранить эту информацию о формате в файле?) Host filename [bcp.fmt]: data.fmt (Имя файла) Starting copy... (Начало копирования) SQLState = S1000, NativeError = 0 Error = [Microsoft][ODBC SQL Server Driver] Unexpected EOF encountered in BCP data-file (Ошибка = ... непредвиденный конец файла в файле данных BCP) 5 rows copied. (Скопировано 5 строк) Network packet size (bytes): 4096 (Размер сетевого пакета [в байтах]) Clock Time (ms.): total 51 Avg 10 (98.04 rows per sec.) (Время (мс): всего 51 В среднем 10 (98.04 строк в сек.)
Как видно из данного примера, вы должны знать эти значения, прежде чем начнете копирование. Когда программа
Как уже говорилось, вам будет намного проще использовать -c. Кроме того, использование параметра -c позволяет выполнять
bcp Northwind.dbo.Customers in data.file -e err.fil -c -Usa
Поскольку параметр -c указывает символьные данные, вам не нужно задавать длину полей и длину префиксов. Если предположить, что вы создали файл data.file с 25 строками данных, разделенных символом tab в соответствии с колонками таблицы Customers, и ввели пароль sa, то соответствующий сеанс будет иметь следующую форму: (Размер вашего сетевого пакета и время работы, возможно, будут отличаться.)
Starting copy... 25 rows copied. Network packet size (bytes): 4096 Clock Time (ms.): total 80 Avg 3 (312.50 rows per sec.)
В этом примере направление копирования было указано параметром in, т.е. данные копировались в базу данных. Всегда имеет смысл указывать
В нашем первом примере раздела "Использование storage type (тип хранения), (длина префикса), field length (длина поля) и field terminator (-f (format), как это показано ниже:
bcp Northwind.dbo.Customers in data2.file -e err.fil -f data.fmt -L 5 -Usa
В предположении, что вы ввели пароль sa и создали data2.file, сеанс будет иметь следующую форму:
Starting copy... 5 rows copied. Network packet size (bytes): 4096 Clock Time (ms.): total 50 Avg 10 (100.00 rows per sec.)
В дополнение к параметру -f в данном примере включен параметр -L. Этот параметр указывает последнюю строку для копирования из входного файла. В данном примере последней обрабатываемой строкой была пятая строка. В результате здесь не появится сообщение об ошибке EOF (конец файла), которое мы видели в предыдущем примере.
Использование
bcp Northwind.dbo.Customers out dataout.dat -e err.fil -U sa
После ввода этой команды и пароля sa начнется выполнение сеанса. (Ввод пользователя показан полужирным шрифтом.)
Enter the file storage type of field CustomerID [nchar]: char Enter prefix-length of field CustomerID [1]: 0 Enter length of field CustomerID [26]: Enter field terminator [none]: , Enter the file storage type of field CompanyName [nvarchar]: char Enter prefix-length of field CompanyName [1]: 0 Enter length of field CompanyName [189]: Enter field terminator [none]: , Enter the file storage type of field ContactName [nvarchar]: char Enter prefix-length of field ContactName [1]: 0 Enter length of field ContactName [143]: Enter field terminator [none]: , Enter the file storage type of field ContactTitle [nvarchar]: char Enter prefix-length of field ContactTitle [1]: 0 Enter length of field ContactTitle [143]: Enter field terminator [none]: , Enter the file storage type of field Address [nvarchar]: char Enter prefix-length of field Address [1]: 0 Enter length of field Address [283]: Enter field terminator [none]: , Enter the file storage type of field City [nvarchar]: char Enter prefix-length of field City [1]: 0 Enter length of field City [73]: Enter field terminator [none]: , Enter the file storage type of field Region [nvarchar]: char Enter prefix-length of field Region [1]: 0 Enter length of field Region [73]: Enter field terminator [none]: , Enter the file storage type of field PostalCode [nvarchar]: char Enter prefix-length of field PostalCode [1]: 0 Enter length of field PostalCode [49]: Enter field terminator [none]: , Enter the file storage type of field Country [nvarchar]: char Enter prefix-length of field Country [1]: 0 Enter length of field Country [73]: Enter field terminator [none]: , Enter the file storage type of field Phone [nvarchar]: char Enter prefix-length of field Phone [1]: 0 Enter length of field Phone [115]: Enter field terminator [none]: , Enter the file storage type of field Fax [nvarchar]: char Enter prefix-length of field Fax [1]: 0 Enter length of field Fax [115]: Enter field terminator [none]: , Do you want to save this format information in a file? [Y/n]: n Host filename [bcp.fmt]: Starting copy... 96 rows copied. Network packet size (bytes): 4096 Clock Time (ms.): total 10 Avg 0 (9600.00 rows per sec.)
В этом интерактивном сеансе
Чтобы создать более удобный для -c, как это показано ниже:
bcp Northwind.dbo.Customers out dataout.dat -e err.fil -c -U sa
После ввода этой команды и пароля sa начнется выполнение сеанса, как показано ниже:
Starting copy... 96 rows copied. Network packet size (bytes): 4096 Clock Time (ms.): total 1 Avg 0 (96000.00 rows per sec.)
В нашем последнем примере для извлечения данных используется параметр queryout. Это параметр позволяет вам задавать запрос при копировании данных из базы данных SQL Server. С помощью этого запроса происходит выбор определенных данных и копирование только этих данных. Параметр queryout достаточно прост для использования – просто не забывайте указывать запрос в кавычках, как это показано ниже:
bcp "SELECT CustomerID, CompanyName FROM Northwind..Customers" queryout dataout.dat -e err.fil -c -U sa Как обычно, введите пароль sa; сеанс будет показан в следующей форме: Starting copy... 96 rows copied. Network packet size (bytes): 4096 Clock Time (ms.): total 1 Avg 0 (96000.00 rows per sec.)
Результатом этого запроса будет файл данных с разделителями в виде символов табуляции и признаками конца строк; этот файл состоит из двух колонок: CustomerID и CompanyName. Это способ полезно использовать, если вы хотите извлечь только определенные колонки или строки базы данных.
Оператор T-SQL BULK INSERT аналогичен программе BULK INSERT нельзя использовать для извлечения данных из баз данных SQL Server. Это ограничение уменьшает его функциональные возможности, но поскольку оператор BULK INSERT выполняется как поток внутри SQL Server, это устраняет необходимость передачи данных из одной программы в другую, что повышает производительность при загрузке данных. Таким образом, оператор BULK INSERT загружает данные более эффективно, чем программа
Как и 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, аналогичны параметрам программы
| Необязательный параметр | Описание |
|---|---|
BATCHSIZE = размер |
Указывает количество строк в группе (пакетном задании). Каждая группа обрабатывается как одна транзакция |
CHECK_CONSTRAINTS |
Указывает на то, что будет выполняться проверка ограничений. По умолчанию ограничения игнорируются. |
CODEPAGE [ = ' |
Указывает кодовую страницу данных в файле данных. Этот параметр полезно использовать только с типами данных char, varchar и text |
ATAFILETYPE [ = 'char' | 'native' | ' |
Указывает тип данных в файле данных; по умолчанию это тип char. Другие типы: native (собственные типы данных базы данных), (символы Unicode) и widenative (то же, что и native, но типы char, varchar и text сохраняются как Unicode) |
FIELDTERMINATOR [ = ограничитель_полей ] |
Указывает ограничитель полей, используемый с типами данных char и . По умолчанию это символ табуляции ( \t ) |
FIRSTROW [ = первая_строка ] |
Номер первой строки для копирования. По умолчанию 1. Этот параметр полезно использовать, если вы хотите пропустить заголовочную информацию в файле данных. |
FORMATFILE [ = форматный_файл ] |
Указывает путь доступа к форматному файлу |
KEEPIDENTITY |
Указывает, что в импортируемых файлах данных присутствуют значения для колонки со свойством identity |
KEEPNULLS |
Указывает, что в пустых колонках сохраняется значение null |
KILOBYTES_PER_BATCH [ = число ] |
Указывает приблизительное количество килобайт на одну группу (пакетное задание), используемую при массовом копировании |
LASTROW [ = последняя_строка ] |
Указывает последнюю строку для выполнения массового копирования. По умолчанию используется значение 0. Этот параметр полезно использовать, если вы хотите вставить только определенное количество строк |
MAXERRORS [ = максимум_ошибок ] |
Указывает, сколько ошибок должно произойти, чтобы прекратить вставку. Значение по умолчанию равно 10 |
ORDER ( колонка [ |
Задает, что данные в указанной колонке должны быть отсортированы в указанном порядке (по возрастанию или убыванию) |
ROWS_PER_BATCH [ = строк_на_группу ] |
Указывает количество строк на одну группу (пакетное задание). Каждая группа копируется в виде одной транзакции. По умолчанию вставка всех строк файла данных выполняется как одна транзакция с использованием одной фиксации. Этот параметр может понадобиться, когда вам нужно выполнять массовые вставки, чтобы освобождать блокировки таблиц, когда идет обработка групп, что позволит выполнять другую обработку |
ROWTERMINATOR [ = разделитель_строк ] |
Указывает разделитель строк для данных типа char и . По умолчанию используется символ новой строки ( \n ) |
Рассмотрим два примера использования оператора BULK INSERT.
В обоих примерах мы будем загружать данные из файла с символьными данными data.file (который использовали в предыдущих примерах) в таблицу Customers базы данных Northwind.
BULK INSERT можно использовать только для вставки данных в базу данных; его нельзя использовать для извлечения данных. А поскольку оператор BULK INSERT не дает такого разнообразия режимов, как программа Для загрузки данных в базу данных используйте следующий оператор 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. Указывается, что
Средство
Вы можете использовать Import Wizard для импорта данных в базу данных из различных источников данных. В отличие от программы BULK INSERT мастер Import Wizard может импортировать данные из источников, отличных от файлов данных. Чтобы использовать Import Wizard, выполните следующие шаги.
(рис 24.2) Начальное окно мастера Data Transformation Services Import/Export Wizard
(рис 24.3) Окно Choose а Data Source (Выберите источник данных)Здесь вы можете выбрать источник данных из раскрывающегося списка Source (Источник). На рис. 24.3 показан выбранный тип
(рис 24.4) Окно Select file format (Выбор формата файла)
(рис 24.6) Окно Specify Column Delimiter (Указание ограничителя колонок)(рис 24.5) Окно Choose a Destination (Выбор получателя данных)
(рис 24.7) Окно Select Source Tables and Views (Выбор исходных таблиц и представлений)null (NOT NULL to NULL, NULL to NOT NULL).
(рис 24.9) Вкладка Column Mappings (Отображение колонок) диалогового окна Column Mappings and Transformations (Отображение и преобразование колонок)(рис 24.8) Вкладка Transformations диалогового окна Column Mappings and Transformations
(рис 24.11) Окно Save, schedule, and replicate package (Сохранение, планирование запуска и репликация пакета)(рис 24.10) Окно Completing the DTS Import Wizard (Завершение работы мастера импорта DTS)Как видно из описания, мастер BULK INSERT в .sql-файле.
(рис 24.12) Окно Choose a Destination (Выбор получателя данных)
Вы можете использовать мастер Export Wizard для экспорта данных из базы данных во внешние хранилища данных. В отличие от программы
(рис 24.13) Начальное окно Data Transformation Services Import/Export Wizard
(рис 24.14) Окно Choose a Data Source (Выбор источника данных)Если щелкнуть на кнопке выбора Use a query to specify the data to transfer (Использовать запрос для указания данных, подлежащих копированию) и затем щелкнуть на кнопке Next, то появится окно Type

(рис 24.16) Окно Choose a Destination (Выбор получателя)(рис 24.15) Окно Specify Table Copy or Query (Копия таблицы или запрос)
(рис 24.17) Окно Type SQL Statement (введите оператор SQL))Если щелкнуть на кнопке выбора Copy table(s) and view(s) from the
(рис 24.18) Окно Select destination file formatОба мастера – Import Wizard и Export Wizard – просты для использования и конфигурирования; они позволяют упростить работу, временами сопряженную с трудностями при использовании других средств. Но следует помнить, что если вам требуется повторное выполнение этих операций, то стоит приложить дополнительные усилия для их реализации в виде сценария. Вы можете создать сценарий, в который входит оператор SQL BULK INSERT, для выполнения нужной операции импорта, или использовать оператор SELECT, где выходные результаты перенаправлены в файл данных, для выполнения операции экспорта.

(рис 24.20) Окно Save, schedule, and replicate package(рис 24.19) Окно Completing the DTS Export Wizard
(рис 24.21) Окно Executing Package
Переходные таблицы – это временные таблицы, которые вы создаете для загрузки данных в SQL Server, для обработки и манипулирования этими данными, а также для копирования этих данных в соответствующую таблицу или таблицы в базе данных. В этом разделе вы узнаете, как и когда использовать
Возможность обработки данных во время процесса загрузки в
В этом разделе мы рассмотрим три примера использования
Рассмотрим таблицу "рынка" данных (
(рис 24.22) Использование переходных таблиц для слияния
Следствием нашего первого примера является сценарий, при котором одна таблица загружается в несколько таблиц рынка данных, что может потребоваться в целях упорядочивания. Эту задачу можно легко выполнить путем копирования данных в переходную таблицу и использования двух запросов для загрузки переходной таблицы в таблицы рынка данных (рис. 24.23).
(рис 24.23) Использование переходных таблиц для разделения данных
Вы можете загружать уникальные значения в таблицу путем массового копирования данных для загрузки в переходную таблицу и последующего использования оператора T-SQL для вставки данных в основную таблицу, только если этих данных еще нет в таблице. Эта возможность полезна в тех случаях, когда вы загружаете данные, которые могут нарушать некоторые деловые правила. Для копирования уникальных значений из переходной таблицы используйте оператор NOT IN, как это показано ниже:
INSERT INTO table ( columnA, columnB )
SELECT columnA, columnB
FROM staging_table
WHERE columnA NOT IN ( SELECT columnA
FROM table )
Этот несколько усложненный оператор SQL просто загружает из переходной таблицы в основную таблицу строки, которые содержат в колонке columnA значение, не совпадающее со значением той же колонки в основной таблице, что позволяет избежать вставки дублированных значений.
Использование оператора SELECT...INTO на самом деле не является методом загрузки базы данных; это способ создания новых таблиц из существующих таблиц или SELECT...INTO нельзя использовать для заполнения существующей таблицы.
Примечание. Чтобы можно было использовать оператор SELECT...INTO, для параметра базы данных select into/bulkcopy должно быть задано значение TRUE. Чтобы задать этот параметр, используйте следующий оператор T-SQL:
exec sp_dboption <имя_базы_данных>, "select into/bulkcopy", TRUE
Ниже приводится синтаксис оператора SELECT...INTO:
SELECT <список_колонок> INTO <имя_новой_таблицы> <предложение_для_select>
Переменная предложение_для_select указывает операторы, которые обычно уточняют оператор SELECT, такие как FROM и WHERE. Оператор SELECT...INTO легко использовать, как показано в следующем примере:
exec sp_dboption "example", "select into/bulkcopy", TRUE
GO
SELECT order_id,
contact_id,
item_id,
item_description,
amount INTO newsales
FROM stage
GO
exec sp_dboption "example", "select into/bulkcopy", FALSE
GO
В данном случае указана база данных "example" и создаваемая таблица newsales. Данные извлекаются из таблицы
В этой главе вы узнали, как загружать базу данных SQL Server с помощью программы BULK INSERT и средств SELECT...INTO. Эти средства и методы, несомненно, помогут вам, поскольку загрузка базы данных является одной из основных задач для DBA. В главе 25 вы узнаете о компонентах Distributed Transaction Coordinator и Microsoft Transaction Server.
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.