SQL Server 2000

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

Разбить на страницы
Показывать лекцию целиком

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

  • Использование программы Bulk Copy Program (BCP). BCP – это внешняя программа, поставляемая вместе с Microsoft SQL Server 2000 для загрузки файлов данных в базу данных. BCP можно также использовать для копирования данных из какой-либо таблицы SQL Server в файл данных.
  • Использование оператора BULK INSERT. Оператор Transact-SQL (T-SQL) BULK INSERT позволяет вам копировать большие объемы данных из файла данных в таблицу SQL Server в рамках системы SQL Server. Поскольку этот оператор является оператором SQL (выполняется из ISQL, OSQL или анализатора запросов Query Analyzer), то весь процесс выполняется как поток SQL Server. Этот оператор нельзя использовать для копирования данных из SQL Server в файл данных.
  • Использование служб преобразования данных Data Transformation Services (DTS). DTS – это набор инструментальных средств, поставляемых вместе с SQL Server, которые намного упрощают задачу копирования данных в SQL Server и из SQL Server. В набор DTS включен мастер для импорта данных и мастер для экспорта данных.
  • Примечание. Хотя переходные таблицы сами по себе не содержат механизма загрузки данных, но их обычно используют при загрузке базы данных.

    Каждый из этих методов обладает различными возможностями и характеристиками. Вы обязательно найдете хотя бы один метод, отвечающий вашим требованиям.

    Примечание. Восстановление базы данных из файла резервной копии можно также рассматривать как форму загрузки в базу данных, но поскольку резервное копирование и восстановление описываются в главах 32 и 33, эти темы здесь не рассматриваются. Определенные параметры конфигурирования базы данных являются общими для программы BCP и для оператора BULK INSERT. Эти параметры базы данных определяют, как выполняется массовое копирование. Эти параметры должны быть заданы до начала операций загрузки данных.

    Для вас могут оказаться полезными следующие дополнительные операции:

  • Оператор SELECT...INTO. Этот оператор используется для копирования данных из одной таблицы в другую.
  • Переходные таблицы.Переходные таблицы – это временные таблицы, которые обычно используются для преобразования данных внутри базы данных. Вы можете использовать эти таблицы, чтобы облегчить процесс загрузки и модифицировать данные во время загрузки.
  • Производительность операций загрузки

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

    Параметры журнального протоколирования

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

    Примечание.. После отказа системы SQL Server восстановит базу данных. Для всех транзакций, которые не были фиксированы на момент отказа, будет выполнен откат (отмена). Все транзакции, которые были фиксированы на момент отказа, будут повторно выполнены (восстановлены). Откат и повторное выполнение транзакций возвратят систему в состояние, в котором она находилась перед отказом. (О резервном копировании и восстановлении см. главы 32 и 33.)

    По умолчанию все операции вставки в базу данных полностью протоколируются, что позволяет выполнить восстановление и откат транзакций в случае отказа системы. Отключая полное протоколирование массового копирования (которое выполняется с помощью программы BCP, оператора BULK INSERT или оператора SELECT...INTO ), вы можете снизить количество протоколируемых данных, но при этом будут поддерживаться только операции отката. Это повысит производительность резервного копирования, но потребует повторного запуска всего процесса загрузки в базу данных в случае отказа системы, поскольку не будет выполняться журнальное протоколирование, которое обычно используется для восстановления базы данных. Этот вариант относится к переходным таблицам, только если вы загружаете эти таблицы с помощью описанных выше методов массового копирования.

    Полное протоколирование этих операций массового копирования отключается при выполнении всех следующих условий:

  • Для параметра базы данных SELECT INTO/BULKCOPY задано значение TRUE. Вот синтаксис этой команды с использованием хранимой процедуры sp_dboption:
    exec sp_dboption имя_базы_данных, "select into/bulkcopy", TRUE
  • Вы можете также конфигурировать этот параметр с помощью Enterprise Manager. (О Enterprise Manager см. главу 8.)
  • Таблица, в которую загружаются данные, не реплицируется. (О репликации см. главы 26, 27 и 28.)
  • Задана подсказка 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
    Примечание. Вы можете задать дополнительные параметры во вкладке Options (Параметры) окна Properties (Свойства) базы данных(рис. 24.1). Флажок Restrict Access (Ограничить доступ) ограничивает доступ определенными ролями или одним пользователем. Флажок Read Only (Только чтение) запрещает доступ к базе данных по записи. Флажок ANSI NULL Default (Значение NULL по умолчанию) указывает, какое значение задается для колонок, допускающих пустые значения, – NULL или NOT NULL. Флажок Recursive Triggers (Рекурсивные триггеры) просто разрешает рекурсивную активизацию триггеров. Флажок Auto Update Statistics (Автоматическое обновление статистики) разрешает SQL Server обновлять любую устаревшую статистику во время оптимизации. Флажок Torn Page Detection (Обнаружение дефектных страниц) разрешает удалять незавершенные страницы. Флажок Auto Close (Автоматическое закрытие) указывает, что база данных будет закрыта после освобождения всех ее ресурсов и отсоединения всех пользователей. Флажок Auto Shrink (Автоматическое сжатие) указывает, что SQL Server будет периодически сжимать файлы базы данных. Флажок Auto Create Statistics (Автоматическое создание статистики) разрешает SQL Server автоматически создавать статистику во время оптимизации. И флажок Use Quoted Identifiers (Использование идентификаторов в кавычках) активизирует правила ANSI по использованию кавычек. (рис 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 вы можете выполнять копирование из файла данных в SQL Server или из SQL Server в файл данных. BCP полезна для передачи данных в SQL Server из других баз данных, а также для передачи данных, создаваемых пользователем. В этом разделе вы узнаете об использовании программы BCP и ее параметров, а также о форматировании данных, чтобы их можно было копировать с помощью BCP в SQL Server и из SQL Server.

    Синтаксис BCP

    BCP – это исполняемая из командной строки программа, которая вызывается из окна приглашения на ввод команды (окна командной строки). Для BCP требуется указывать определенные обязательные параметры, и вы можете использовать с этой программой много дополнительных (необязательных) параметров. Ниже приводится формат команды 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]"]

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

    Обязательные параметры указывают, в частности, местоположение для извлечения данных и местоположение для вставки данных. Как уже говорилось, с помощью BCP вы можете извлекать данные из файла данных и помещать их таблицу (или представление) SQL Server или извлекать данные из таблицы (или представления) и помещать их в файл данных.

    Вы можете указывать таблицу или представление, используемые в операции массового копирования, одним из двух способов. Во-первых, вы можете использовать параметр определение_таблицы/представления. Самое простое определение состоит из имени таблицы или представления. Как показано выше в формате этой команды, вы можете задавать имя базы данных, где находится указанная таблица или представление, и/или владельца таблицы или представления. Если имя базы данных не указано, то это принятая по умолчанию база данных, указанная в учетной записи подключения (login) данного пользователя. (Об определении пользователя см. главу 34.)

    В качестве альтернативного способа вы можете указывать таблицу или представление с помощью запроса. Используя этот способ, вы указываете, какие данные будут извлекаться из этой таблицы или представления. (Чтобы указать таблицу или представление для извлечения или вставки данных можно использовать параметр определение_таблицы/представления. Этот запрос заключается в кавычки и может состоять из оператора SELECT с предложениями, такими как ORDER BY. Если вы задаете определение запроса, вы должны также задать параметр queryout (см. табл. 24.1).

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

    И наконец, вы должны задать один или несколько параметров, перечисленных в табл. 24.1.

    Управляющие описатели массового копирования
    Параметр Описание
    In (В базу данных) Указывает, что массовое копирование будет выполняться из файла данных в таблицу или представление базы данных SQL Server
    Out (Из базы данных) Указывает, что массовое копирование будет выполняться из таблицы или представления базы данных SQL Server в файл данных
    Queryout (Извлечение с помощью запроса) Указывает, что данные будут извлекаться из базы данных SQL Server с помощью определенного запроса. Затем операция массового копирования будет копировать данные, выбранные с помощью этого запроса, в файл данных
    Format (Формат) Указывает, что в дополнение к операции массового копирования программа BCP будет создавать форматный файл. Для создания этого форматного файла используются параметры форматирования ( -n, -c, -w, -6 или -N ) и ограничители (разделители) таблицы или представления. Параметр format должен использоваться в сочетании с опцией -f. Форматный файл позволяет вам сохранять определения программы BCP, чтобы вам не требовалось повторять их при последующем использовании BCP

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

    Вы можете использовать необязательные (дополнительные) параметры, перечисленые в табл. 24.2, для модифицирования работы программы BCP при выполнении массового копирования.

    Необязательные описатели массового копирования
    Параметр Описание
    -a размер_пакета Указывает количество байтов в сетевом пакете, передаваемом между клиентом и сервером
    -b размер_группы Указывает количество строк, которое нужно включить в группу (пакетное задание). Каждая группа копируется как одна транзакция. По умолчанию все строки файла данных копируются как одна группа с использованием одной фиксации. Этот параметр может понадобиться, когда вам нужно выполнять массовые вставки, чтобы освобождать блокировки таблиц, когда идет обработка таких групп, что позволит выполнять другую обработку
    -c Указывает, что BCP использует символьный тип данных
    -e файл_ошибок Указывает путь доступа к файлу ошибок, в котором протоколируются ошибки при работе BCP
    -f форматный_файл Указывает путь доступа к форматному файлу, который ранее использовался программой BCP. Форматный файл создается в том случае, если BCP запускается с параметром format, который описан выше. При использовании форматного файла другие параметры форматирования можно не указывать
    -h "подсказка [,.n]" Указывает подсказки, которые будут использоваться при массовом копировании. Это могут быть следующие подсказки:
  • ORDER (колонка [ASC | DESC] ). Указывает на сортировку данных в указанной колонке
  • ROWS_PER_BATCH = число. Указывает количество строк на одну группу (пакетное задание). Этот параметр аналогичен -b, но его не следует использовать в сочетании с -b. Параметр -b задает передачу указанной группы строк в SQL Server в виде одной транзакции. Если -b не указан, то весь файл данных передается на SQL Server в виде одной транзакции, а параметр ROWS_PER_BATCH используется для того, чтобы помочь SQL Server оценить объем нагрузки. Эта информация используется для оптимизации нагрузки внутренним образом
  • KILOBYTES_PER_BATCH = число. Указывает приблизительное количество килобайт на одну группу. Этот параметр аналогичен -b, но для указания размера группы используются килобайты, а не количество строк
  • TABLOCK. Указывает, что в течение массовой загрузки будет использоваться блокировка на уровне таблицы. Этот метод существенно повышает производительность загрузки за счет снижения конкуренции блокировок по данной таблице
  • CHECK_CONSTRAINTS. Указывает на необходимость проверки ограничений во время массовой загрузки. По умолчанию ограничения игнорируются
  • -i входной_файл Указывает имя файла ответов. Файл ответов содержит ответы на вопросы, задаваемые программой BCP, когда база данных работает в интерактивном режиме
    -k Указывает, что в пустые колонки заносятся значения null, а не значения по умолчанию
    -m максимум_ошибок Указывает, сколько ошибок должно произойти, чтобы BCP прекратила работу. Если этот параметр не указан, то используется значение по умолчанию, равное 10
    -n Указывает, что BCP использует собственные (native) типы данных
    -o выходной_файл Указывает выходной файл, в который поступает выходная информация программы BCP. Это обычный текстовый файл, который можно читать с помощью Notepad (Блокнота) или других утилит
    -q Указывает, что для имен таблицы и представления требуются заключенные в кавычки идентификаторы, содержащие символы, отличные от стандарта ANSI, такие как пробел
    -r разделитель_строк Указывает символ окончания строк. По умолчанию используется символ новой строки
    -t ограничитель_полей Указывает ограничитель полей. По умолчанию используется символ табуляции (tab)
    -v Выводит номер версии и информацию об авторских правах программы BCP
    -w Указывает, что BCP использует символы Unicode
    -C кодовая_страница Указывает кодовую страницу данных в файле данных
    -E Указывает, что копируемый файл содержит значения для идентификации колонок
    -F первая_строка Указывает первую строку, с которой начинается массовое копирование. Если этот параметр не указан, по первой строкой будет строка 1. Этот параметр полезно использовать, если вы хотите пропустить заголовочную информацию в файле данных
    -L последняя_строка Указывает последнюю строку для выполнения массового копирования. Принятое по умолчанию значение 0 указывает, что последней строкой для копирования является последняя строка файла данных. Этот параметр полезно использовать, если вы хотите копировать только определенное количество строк
    -N Указывает, что BCP использует собственные типы данных для несимвольных данных и Unicode для символьных данных
    -P пароль Указывает пароль для идентификатора учетной записи подключения (login ID), который используется в параметре -U.
    -R Указывает, что для денежных единиц, даты и времени используется региональный формат клиентской системы
    -S имя_сервера Указывает имя сервера, на который выполняется копирование
    -T Указывает, что используется доверяемое соединение. Если используется этот параметр, то переменные login_id и пароль не требуются; используются данные учетной записи пользователя сети
    -U login_id Указывает login ID пользователя (идентификатор учетной записи подключения), под которым будет выполняться копирование данных
    -V 60 | 65 | 70 Выполняет массовое копирование с использованием типов данных из более ранней версии SQL Server. Этот параметр следует использовать в сочетании с параметрами -c и -n
    -6 Указывает, что BCP использует типы данных Microsoft SQL Server 6 или Microsoft SQL Server 6.5

    Как видно из этой таблицы, для использования возможностей BCP можно задавать разнообразные параметры и комбинации этих параметров. Наилучшим способом ознакомления с этими параметрами является проработка примеров использования BCP, которые приводятся ниже.

    Использование BCP

    В этом разделе мы рассмотрим несколько примеров использования BCP для загрузки данных в SQL Server и из SQL Server. Эти примеры не охватывают все возможности, но они дадут вам хорошее представление о разнообразных режимах и методах работы с помощью BCP.

    Вы можете использовать BCP из командной строки, как это описано выше, или в интерактивном стиле. Для вызова BCP без какого-либо дополнительного взаимодействия с этой программой, вы должны задать параметр -n, -c, -w или -N. Если не указан ни один из этих параметров, то программа BCP будет работать в интерактивном режиме.

    Примечание.Во всех следующих примерах используется таблица Customers из базы данных Northwind.

    Загрузка данных путем интерактивного использования BCP

    Использование BCP для загрузки данных в интерактивном режиме может вызывать определенные трудности, поскольку этот метод требует, чтобы вы указывали ширину и типы колонок. Вы не обязаны это делать, если используете параметры командной строки, как это описано в следующем разделе. Хотя использование BCP в интерактивном режиме не рекомендуется, мы рассмотрим пример использования этого метода, чтобы вы имели полное представление о том, как работает BCP. В этом примере мы выполним копирование данных из файла data2.file в таблицу Customers базы данных Northwind с записью ошибок в файл err.file. Вы должны иметь заранее созданный файл данных data2.file. Этот файл содержит данные, которые вам нужно загрузить в таблицу Customers. Для запуска интерактивного сеанса в качестве системного администратора введите следующий оператор:

    bcp Northwind.dbo.Customers in data2.file -e err.file -Usa

    Затем у вас будет запрошен пароль. Введите пароль системного администратора (sa).

    Далее программа BCP будет запрашивать у вас информацию, касающуюся данных, которые вы хотите копировать. Ниже приводится пример интерактивного сеанса. Отметим, что ввод пользователя показан полужирным шрифтом.

    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 строк в сек.)

    Как видно из данного примера, вы должны знать эти значения, прежде чем начнете копирование. Когда программа BCP достигла конца файла, было выдано сообщение об ошибке, поскольку мы не указали количество строк для копирования.

    Загрузка данных программой BCP с помощью параметров командной строки

    Как уже говорилось, вам будет намного проще использовать BCP для загрузки данных, если вы будет использовать параметры командной строки. В примере этого раздела мы будем использовать BCP для загрузки данных из файла данных, состоящего из символьных колонок, разделенных символами табуляции (tab). Чтобы указать, что в файле данных используется символьный формат, мы будем использовать параметр -c. Кроме того, использование параметра -c позволяет выполнять BCP в неинтерактивном режиме. Следующая команда копирует 25 строк данных из файла данных data.file. в таблицу Customers базы данных Northwind:

    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, т.е. данные копировались в базу данных. Всегда имеет смысл указывать файл ошибок, в котором ведется журнал ошибок, возникших во время сеанса BCP. Если вы не указываете файл ошибок, эти ошибки выводятся на экран и, в конце концов, в результате прокрутки исчезают с экрана.

    Загрузка данных с помощью параметра -f (format)

    В нашем первом примере раздела "Использование BCP" мы создали форматный файл с именем data.fmt. Вместо ввода вручную всех параметров форматирования, таких как storage type (тип хранения), prefix length (длина префикса), 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

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

    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.)

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

    Извлечение данных с помощью BCP с параметрами командной строки

    Чтобы создать более удобный для чтения файл данных, в котором данные разделены символом табуляции, а каждая строка заканчивается символом новой строки, используйте параметр -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

    В нашем последнем примере для извлечения данных используется параметр 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. Это способ полезно использовать, если вы хотите извлечь только определенные колонки или строки базы данных.

    Оператор 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.

    Необязательные параметры для оператора 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. Указывается, что разделителем полей будет символ табуляции (несмотря на то, что он используется по умолчанию). В этом примере также указано, что во время процесса массовой вставки будут проверяться ограничения, а также задается блокировка таблицы на период загрузки. Транзакции, выполняющие загрузку, будут выполняться группами по пять строк.

    Службы преобразования данных Data Transformation Services (DTS)

    Средство DTS является частью SQL Server Enterprise Manager и предназначено для того, чтобы вы могли легко импортировать данные в базу данных и экспортировать данные из базы данных. DTS включает в себя двух мастеров: мастер импорта Import Wizard и мастер экспорта Export Wizard.* В этом разделе мы рассмотрим использование этих мастеров.

    Мастер Import Wizard

    Вы можете использовать Import Wizard для импорта данных в базу данных из различных источников данных. В отличие от программы BCP и оператора T-SQL BULK INSERT мастер Import Wizard может импортировать данные из источников, отличных от файлов данных. Чтобы использовать Import Wizard, выполните следующие шаги.

  • В окне Enterprise Manager раскройте группу серверов и щелкните на имени сервера, на который вы хотите импортировать данные. В меню Tools (Сервис) выберите пункт Wizards (Мастера). В диалоговом окне Select Wizard (Выбор мастера) раскройте папку Data Transformation Services (Службы преобразования данных), щелкните на DTS Import Wizard (Мастер импорта с помощью DTS) и затем щелкните на кнопке OK. В качестве альтернативного способа щелкните на имени сервера, укажите пункт All Tasks (Все задачи) и затем щелкните на пункте Import Data (Импорт данных). Появится начальное окно мастера Data Transformation Services Import/Export Wizard (рис. 24.2).(рис 24.2) Начальное окно мастера Data Transformation Services Import/Export Wizard
  • Щелкните на кнопке Next (Далее), чтобы появилось окно Choose а Data Source (Выберите источник данных) (рис. 24.3).(рис 24.3) Окно Choose а Data Source (Выберите источник данных)Здесь вы можете выбрать источник данных из раскрывающегося списка Source (Источник). На рис. 24.3 показан выбранный тип Text File (Текстовый файл). Вы можете выбрать источник данных из следующих вариантов:
  • dBase
  • Microsoft Access
  • Microsoft Data Link
  • Microsoft Excel
  • Microsoft Visual FoxPro
  • Other (ODBC data source) (Другой [источник данных ODBC])
  • Other OLE_DB data source (Другие источники данных OLE_DB)
  • Paradox
  • Data files (Файлы данных)
  • Варианты выбора частично зависят от драйверов ODBC, которые вы инсталлировали в вашей системе. Например, если у вас инсталлирован драйвер Oracle ODBC, в списке будет также представлен провайдер OLE DB provider for Oracle. Окно Choose a Data Source изменяется в зависимости от выбранного вами источника данных. Независимо от выбранного вами источника потребуется ввести информацию о файле и (иногда) информацию для входа (имя пользователя и пароль).
  • Щелкните на кнопке Next, чтобы появилось окно Select file format (Выбор формата файла) (рис. 24.4). (Окно Select file format появляется только в том случае, если выбран тип файла Text File.) В этом окне вы можете выбрать формат файла. Ниже описываются параметры этого окна:
  • Кнопки выбора Delimited (С ограничителями) и Fixed field (Поле фиксированной ширины) позволяют вам выбрать формат входного файла, а также определенный символ-ограничитель или фиксированную ширину полей.
  • В раскрывающемся списке File type (Тип файла) вы можете выбрать тип кодировки для входного файла: ANSI, OEM или Unicode.(рис 24.4) Окно Select file format (Выбор формата файла)
  • В раскрывающемся списке Row delimiter (Разделитель строк) вы можете указать символ, который используется как признак конца каждой строки входного файла.
  • В раскрывающемся списке Text qualifier (Описатель текста) вы можете указать ограничитель текста в файле с ограничителями.
  • В прокручиваемом списке Skip rows (Пропустить строки) вы можете указать, сколько строк нужно пропустить в начале входного файла.
  • Флажок First row has column names (Первая строка содержит имена колонок) указывает, что первая строка содержит не данные, а названия, и ее нужно пропустить.
  • Выберите вариант Delimited для формата файла, символы {CR}{LF} для разделителя строк (Row delimiter) и вариант <none> (нет) в списке Text qualifier. Затем щелкните на кнопке Next, чтобы появилось окно Specify Column Delimiter (Указание ограничителя колонок) (рис. 24.5). (Если щелкнуть на кнопке выбора Fixed Field вместо Delimited, то появится окно Fixed Field Column Positions (Позиции колонок полей фиксированной ширины).) Это окно удобно для указания ограничителя колонок, поскольку вы получаете немедленный результат в зависимости от вашего выбора, который показывает, насколько подходит ваш выбор. Вы можете использовать запятую (кнопка выбора Comma), точку с запятой (Semicolon) или любой другой ограничитель. После выбора ограничителя в окне Preview (Просмотр) появляются строки. Это позволяет вам увидеть, насколько подходит выбранный вами ограничитель для данных входного файла.
  • После выбора ограничителя щелкните на кнопке Next, чтобы появилось окно Choose a Destination (Выбор получателя данных) (рис 24.6(рис 24.6) Окно Specify Column Delimiter (Указание ограничителя колонок)(рис 24.5) Окно Choose a Destination (Выбор получателя данных)
  • Щелкните на кнопке Next, чтобы появилось окно Select Source Tables and Views (Выбор исходных таблиц и представлений) (рис. 24.7). В этом окне вам нужно выбрать из раскрывающегося списка колонки Destination таблицу, в которую будут загружаться данные. Вы можете предварительно просмотреть эти данные, щелкнув на кнопке Preview. Вы можете также использовать кнопки Select All (Выбрать все) и Deselect All (Отменить весь выбор), чтобы выбрать все таблицы или не выбирать ни одной таблицы.(рис 24.7) Окно Select Source Tables and Views (Выбор исходных таблиц и представлений)
  • В том же окне вы имеете доступ к службам преобразования. Эти службы позволяют вам преобразовывать данные (изменять колонки и т.д.) при выполнении импорта. Для преобразования данных сначала щелкните на кнопке Transform (Преобразование) (кнопка с тремя точками под словом Transform), чтобы открыть диалоговое окно Column Mappings and Transformations (Отображение и преобразование колонок) (рис. 24.8). Во вкладке Column Mappings (Отображение колонок) вы можете выбрать создание новой таблицы (кнопка выбора Create destination table) либо удаление строк (Delete rows) или добавление строк (Append rows) в существующей таблице. Вариант Append rows to destination table (Добавление строк к таблице-получателю) принят по умолчанию. Если выбрать создание новой таблицы, то с помощью кнопки Edit SQL (Редактировать SQL) вы можете просматривать и модифицировать оператор SQL, который будет использоваться для создания этой таблицы.
  • Щелкните на вкладке Transformations для просмотра параметров преобразования (рис. 24.9). В окне этой вкладки вы можете выбрать копирование непосредственно в колонки таблицы (Copy the source columns directly ...) или преобразование информации во время ее копирования (Transform information as it is copied). Здесь указаны такие способы преобразования, как преобразование точности (16-битные данные в 32-битные, 32-битные в 16-битные). Можно также задавать преобразование значений null (NOT NULL to NULL, NULL to NOT NULL).
  • Щелкните на кнопке OK, чтобы закрыть это диалоговое окно, и щелкните на кнопке Next, чтобы появилось окно Save, schedule, and replicate package (Сохранение, планирование запуска и репликация пакета) (рис 24.10(рис 24.9) Вкладка Column Mappings (Отображение колонок) диалогового окна Column Mappings and Transformations (Отображение и преобразование колонок)(рис 24.8) Вкладка Transformations диалогового окна Column Mappings and Transformations
  • Щелкните на кнопке Next, чтобы появилось окно Completing the DTS Import Wizard (Завершение работы мастера импорта DTS) (рис 24.11(рис 24.11) Окно Save, schedule, and replicate package (Сохранение, планирование запуска и репликация пакета)(рис 24.10) Окно Completing the DTS Import Wizard (Завершение работы мастера импорта DTS)
  • После щелчка на кнопке Finish вы увидите окно Executing Package (Идет выполнение пакета) (рис. 24.12). Затем появится окно сообщения, информирующее вас, что копирование данных завершено или возникла ошибка.
  • Как видно из описания, мастер DTS Import Wizard превращает выполнение импорта данных в простую процедуру. Однако при повторяемом выполнении этой задачи более эффективным будет создание сценария, поскольку он наиболее подходит для быстрого и простого многократного использования. Файл сценария создается путем сохранения оператора BULK INSERT в .sql-файле.

    (рис 24.12) Окно Choose a Destination (Выбор получателя данных)

    Мастер Export Wizard

    Вы можете использовать мастер Export Wizard для экспорта данных из базы данных во внешние хранилища данных. В отличие от программы BCP, мастер Export Wizard может также экспортировать данные в хранилища, отличные от файлов данных. Для использования Export Wizard выполните следующие шаги.

  • В окне Enterprise Manager раскройте группу серверов и щелкните на имени сервера, с которого вы хотите экспортировать данные. В меню Tools выберите пункт Wizards (Мастера). В диалоговом окне Select Wizard раскройте папку Data Transformation Services, щелкните на DTS Export Wizard (Мастер экспорта с помощью DTS) и затем щелкните на кнопке OK. В качестве альтернативного способа щелкните на имени сервера, укажите пункт All Tasks (Все задачи) и затем щелкните на пункте Export Data (Экспорт данных). Появится начальное окно мастера Data Transformation Services Import/Export Wizard (рис. 24.13).(рис 24.13) Начальное окно Data Transformation Services Import/Export Wizard
  • Щелкните на кнопке Next, чтобы появилось окно Choose a Data Source (рис. 24.14). В этом окне вы можете указать источник данных. Вы можете оставить вариант по умолчанию (Microsoft OLE DB Provider for SQL Server) или выбрать вариант Microsoft ODBC Driver for SQL Server. При любом варианте произойдет подсоединение к SQL Server. Для экспорта данных из других систем управления базами данных можно использовать другие варианты. Затем выберите базу данных – в данном случае базу данных Northwind. Вы можете также задать дополнительные параметры, такие как тайм-аут соединения, сетевой адрес, сетевые библиотеки и идентификатор рабочей станции, в окне, которое появится, если щелкнуть на кнопке Advanced. Однако эти параметры обычно не требуется модифицировать.(рис 24.14) Окно Choose a Data Source (Выбор источника данных)
  • Щелкните на кнопке Next, чтобы появилось окно Choose a Destination (Выбор получателя) (рис. 24.15). Параметры этого окна варьируются в зависимости от типа данных выбранного вами получателя данных; однако в большинстве случаев вам потребуется ввести данные для входа и информацию о файле. В данном случае мы выберем вариант получателя данных Text File (Текстовый файл), который не требует данных для входа, поэтому мы сможем сохранить таблицу базы данных в текстовой форме. Введите имя выходного файла в текстовом поле File name (Имя файла).
  • Щелкните на кнопке Next, чтобы появилось окно Specify Table Copy or Query (Копия таблицы или запрос) (рис. 24.16). В этом окне вы можете выбрать между экспортом всей таблицы (кнопка выбора Copy table(s)...) или экспортом, осуществляемым через запрос (кнопка выбора Use a query...). Если в качестве получателя данных выбрана другая база данных SQL Server, то станет доступна третья кнопка выбора – Copy objects and data between SQL Server databases (Копировать объекты и данные между базами данных SQL Server).

    Если щелкнуть на кнопке выбора Use a query to specify the data to transfer (Использовать запрос для указания данных, подлежащих копированию) и затем щелкнуть на кнопке Next, то появится окно Type SQL Statement (Введите оператор SQL) (рис. 24.17). Здесь вы можете ввести оператор, который осуществит выбор данных для экспорта. С помощью этого запроса можно выбрать подмножество колонок или строк или выбрать всю таблицу, как это показано в данном примере.

    (рис 24.16) Окно Choose a Destination (Выбор получателя)(рис 24.15) Окно Specify Table Copy or Query (Копия таблицы или запрос)(рис 24.17) Окно Type SQL Statement (введите оператор SQL))
  • Щелкните на кнопке Next, чтобы появилось окно Select destination file format (Выбор формата выходного файла) ((рис. 24.18). (Раскрывающийся список Source не появится в этом окне, если вы вошли в это окно из окна Type SQL Statement.) Здесь вы можете задать несколько параметров форматирования для выходного файла, включая выбор между файлом с ограничителями и файлом с полями фиксированной ширины. По окончании выбора параметров форматирования щелкните на кнопке Next.

    Если щелкнуть на кнопке выбора Copy table(s) and view(s) from the source database (Копировать таблицу(ы) и представление(я) из исходной базы данных) в окне Specify Table Copy Or Query и щелкнуть на кнопке Next, то появится окно Select destination file format (рис. 24.18). (В данном случае в окне появится раскрывающийся список Source.) В этом окне вам нужно выбрать исходную таблицу, а также выбрать параметры форматирования для выходного файла. По окончания щелкните на кнопке Next.

    (рис 24.18) Окно Select destination file format
  • После щелчка на кнопке Next в окне Select destination file format появится окно Save, schedule, and replicate package (рис. 24.19). Здесь вы можете выбрать между запуском этого задания и сохранением DTS-пакета для будущего использования. Это окно является аналогом соответствующего окна мастера Import Wizard.
  • Щелкните на кнопке Next, чтобы появилось окно Completing the DTS Export Wizard (рис. 24.20). Щелкните на кнопке Finish для запуска экспорта.
  • После щелчка на кнопке Finish в окне мастера Export Wizard начнется выполнение процесса экспорта данных. Как и в случае мастера Import Wizard появится окно Executing Package (рис. 24.21). Затем появится окно сообщения, где говорится об успешном или неуспешном завершении данной работы.
  • Оба мастера – Import Wizard и Export Wizard – просты для использования и конфигурирования; они позволяют упростить работу, временами сопряженную с трудностями при использовании других средств. Но следует помнить, что если вам требуется повторное выполнение этих операций, то стоит приложить дополнительные усилия для их реализации в виде сценария. Вы можете создать сценарий, в который входит оператор SQL BULK INSERT, для выполнения нужной операции импорта, или использовать оператор SELECT, где выходные результаты перенаправлены в файл данных, для выполнения операции экспорта.

    (рис 24.20) Окно Save, schedule, and replicate package(рис 24.19) Окно Completing the DTS Export WizardПримечание. Хотя мы использовали в предыдущих примерах использования мастеров Import Wizard и Export Wizard передачу данных из текстового файла в таблицу базы данных и из таблицы в текстовый файл, эти мастера поддерживают также много других типов передачи данных. Эти мастера особенно полезны для передачи данных между базами данных или другими объектами. (рис 24.21) Окно Executing Package

    Переходные таблицы

    Переходные таблицы – это временные таблицы, которые вы создаете для загрузки данных в SQL Server, для обработки и манипулирования этими данными, а также для копирования этих данных в соответствующую таблицу или таблицы в базе данных. В этом разделе вы узнаете, как и когда использовать переходные таблицы.

    Основы использования переходных таблиц

    Переходная таблица – это временная область хранения базы данных, в которую вы можете копировать данные. Затем вы можете использовать T-SQL для преобразования данных в нужный формат путем выполнения таких операций, как операции объединения, использующие переходную таблицу и существующие таблицы.

    Возможность обработки данных во время процесса загрузки в переходные таблицы позволяет вам обходить определенные ограничения методов загрузки данных. Большинство методов загрузки данных позволяют вам только копировать данные в базу данных без какой-либо обработки. Используя DTS, вы можете выполнять некоторые преобразования данных, но не можете вносить изменения, основываясь на данных, содержащихся в базе данных. Главным преимуществом использования переходных таблиц является то, что вы получаете возможность выполнения операций объединения (слияния), используя при этом информацию, содержащуюся в самой переходной таблице или в существующих таблицах.

    Использование переходных таблиц

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

    Слияние и загрузка таблицы

    Рассмотрим таблицу "рынка" данных (data mart), которая является комбинацией двух таблиц из систем оперативной обработки транзакций (OLTP). Эта таблица содержит колонки A, B, C, D и E; колонки A, B и C существуют в одной таблице и колонки C, D и E – в другой таблице. Обе входные таблицы можно сделать переходными, а для загрузки общей таблицы в рынок данных можно использовать операцию слияния (рис. 24.22).

    (рис 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, для параметра базы данных 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. Данные извлекаются из таблицы stage.

    Заключение

    В этой главе вы узнали, как загружать базу данных SQL Server с помощью программы BCP, оператора BULK INSERT и средств DTS. Вы также ознакомились с переходными таблицами, которые удобно использовать при определенных условиях. И вы узнали, как использовать оператор SELECT...INTO. Эти средства и методы, несомненно, помогут вам, поскольку загрузка базы данных является одной из основных задач для DBA. В главе 25 вы узнаете о компонентах Distributed Transaction Coordinator и Microsoft Transaction Server.

    Страницы:

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

  • Использование программы Bulk Copy Program (BCP). BCP – это внешняя программа, поставляемая вместе с Microsoft SQL Server 2000 для загрузки файлов данных в базу данных. BCP можно также использовать для копирования данных из какой-либо таблицы SQL Server в файл данных.
  • Использование оператора BULK INSERT. Оператор Transact-SQL (T-SQL) BULK INSERT позволяет вам копировать большие объемы данных из файла данных в таблицу SQL Server в рамках системы SQL Server. Поскольку этот оператор является оператором SQL (выполняется из ISQL, OSQL или анализатора запросов Query Analyzer), то весь процесс выполняется как поток SQL Server. Этот оператор нельзя использовать для копирования данных из SQL Server в файл данных.
  • Использование служб преобразования данных Data Transformation Services (DTS). DTS – это набор инструментальных средств, поставляемых вместе с SQL Server, которые намного упрощают задачу копирования данных в SQL Server и из SQL Server. В набор DTS включен мастер для импорта данных и мастер для экспорта данных.
  • Примечание. Хотя переходные таблицы сами по себе не содержат механизма загрузки данных, но их обычно используют при загрузке базы данных.

    Каждый из этих методов обладает различными возможностями и характеристиками. Вы обязательно найдете хотя бы один метод, отвечающий вашим требованиям.

    Примечание. Восстановление базы данных из файла резервной копии можно также рассматривать как форму загрузки в базу данных, но поскольку резервное копирование и восстановление описываются в главах 32 и 33, эти темы здесь не рассматриваются. Определенные параметры конфигурирования базы данных являются общими для программы BCP и для оператора BULK INSERT. Эти параметры базы данных определяют, как выполняется массовое копирование. Эти параметры должны быть заданы до начала операций загрузки данных.

    Для вас могут оказаться полезными следующие дополнительные операции:

  • Оператор SELECT...INTO. Этот оператор используется для копирования данных из одной таблицы в другую.
  • Переходные таблицы.Переходные таблицы – это временные таблицы, которые обычно используются для преобразования данных внутри базы данных. Вы можете использовать эти таблицы, чтобы облегчить процесс загрузки и модифицировать данные во время загрузки.
  • Производительность операций загрузки

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

    Параметры журнального протоколирования

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

    Примечание.. После отказа системы SQL Server восстановит базу данных. Для всех транзакций, которые не были фиксированы на момент отказа, будет выполнен откат (отмена). Все транзакции, которые были фиксированы на момент отказа, будут повторно выполнены (восстановлены). Откат и повторное выполнение транзакций возвратят систему в состояние, в котором она находилась перед отказом. (О резервном копировании и восстановлении см. главы 32 и 33.)

    По умолчанию все операции вставки в базу данных полностью протоколируются, что позволяет выполнить восстановление и откат транзакций в случае отказа системы. Отключая полное протоколирование массового копирования (которое выполняется с помощью программы BCP, оператора BULK INSERT или оператора SELECT...INTO ), вы можете снизить количество протоколируемых данных, но при этом будут поддерживаться только операции отката. Это повысит производительность резервного копирования, но потребует повторного запуска всего процесса загрузки в базу данных в случае отказа системы, поскольку не будет выполняться журнальное протоколирование, которое обычно используется для восстановления базы данных. Этот вариант относится к переходным таблицам, только если вы загружаете эти таблицы с помощью описанных выше методов массового копирования.

    Полное протоколирование этих операций массового копирования отключается при выполнении всех следующих условий:

  • Для параметра базы данных SELECT INTO/BULKCOPY задано значение TRUE. Вот синтаксис этой команды с использованием хранимой процедуры sp_dboption:
    exec sp_dboption имя_базы_данных, "select into/bulkcopy", TRUE
  • Вы можете также конфигурировать этот параметр с помощью Enterprise Manager. (О Enterprise Manager см. главу 8.)
  • Таблица, в которую загружаются данные, не реплицируется. (О репликации см. главы 26, 27 и 28.)
  • Задана подсказка 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
    Примечание. Вы можете задать дополнительные параметры во вкладке Options (Параметры) окна Properties (Свойства) базы данных(рис. 24.1). Флажок Restrict Access (Ограничить доступ) ограничивает доступ определенными ролями или одним пользователем. Флажок Read Only (Только чтение) запрещает доступ к базе данных по записи. Флажок ANSI NULL Default (Значение NULL по умолчанию) указывает, какое значение задается для колонок, допускающих пустые значения, – NULL или NOT NULL. Флажок Recursive Triggers (Рекурсивные триггеры) просто разрешает рекурсивную активизацию триггеров. Флажок Auto Update Statistics (Автоматическое обновление статистики) разрешает SQL Server обновлять любую устаревшую статистику во время оптимизации. Флажок Torn Page Detection (Обнаружение дефектных страниц) разрешает удалять незавершенные страницы. Флажок Auto Close (Автоматическое закрытие) указывает, что база данных будет закрыта после освобождения всех ее ресурсов и отсоединения всех пользователей. Флажок Auto Shrink (Автоматическое сжатие) указывает, что SQL Server будет периодически сжимать файлы базы данных. Флажок Auto Create Statistics (Автоматическое создание статистики) разрешает SQL Server автоматически создавать статистику во время оптимизации. И флажок Use Quoted Identifiers (Использование идентификаторов в кавычках) активизирует правила ANSI по использованию кавычек. (рис 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 вы можете выполнять копирование из файла данных в SQL Server или из SQL Server в файл данных. BCP полезна для передачи данных в SQL Server из других баз данных, а также для передачи данных, создаваемых пользователем. В этом разделе вы узнаете об использовании программы BCP и ее параметров, а также о форматировании данных, чтобы их можно было копировать с помощью BCP в SQL Server и из SQL Server.

    Синтаксис BCP

    BCP – это исполняемая из командной строки программа, которая вызывается из окна приглашения на ввод команды (окна командной строки). Для BCP требуется указывать определенные обязательные параметры, и вы можете использовать с этой программой много дополнительных (необязательных) параметров. Ниже приводится формат команды 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]"]

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

    Обязательные параметры указывают, в частности, местоположение для извлечения данных и местоположение для вставки данных. Как уже говорилось, с помощью BCP вы можете извлекать данные из файла данных и помещать их таблицу (или представление) SQL Server или извлекать данные из таблицы (или представления) и помещать их в файл данных.

    Вы можете указывать таблицу или представление, используемые в операции массового копирования, одним из двух способов. Во-первых, вы можете использовать параметр определение_таблицы/представления. Самое простое определение состоит из имени таблицы или представления. Как показано выше в формате этой команды, вы можете задавать имя базы данных, где находится указанная таблица или представление, и/или владельца таблицы или представления. Если имя базы данных не указано, то это принятая по умолчанию база данных, указанная в учетной записи подключения (login) данного пользователя. (Об определении пользователя см. главу 34.)

    В качестве альтернативного способа вы можете указывать таблицу или представление с помощью запроса. Используя этот способ, вы указываете, какие данные будут извлекаться из этой таблицы или представления. (Чтобы указать таблицу или представление для извлечения или вставки данных можно использовать параметр определение_таблицы/представления. Этот запрос заключается в кавычки и может состоять из оператора SELECT с предложениями, такими как ORDER BY. Если вы задаете определение запроса, вы должны также задать параметр queryout (см. табл. 24.1).

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

    И наконец, вы должны задать один или несколько параметров, перечисленных в табл. 24.1.

    Управляющие описатели массового копирования
    Параметр Описание
    In (В базу данных) Указывает, что массовое копирование будет выполняться из файла данных в таблицу или представление базы данных SQL Server
    Out (Из базы данных) Указывает, что массовое копирование будет выполняться из таблицы или представления базы данных SQL Server в файл данных
    Queryout (Извлечение с помощью запроса) Указывает, что данные будут извлекаться из базы данных SQL Server с помощью определенного запроса. Затем операция массового копирования будет копировать данные, выбранные с помощью этого запроса, в файл данных
    Format (Формат) Указывает, что в дополнение к операции массового копирования программа BCP будет создавать форматный файл. Для создания этого форматного файла используются параметры форматирования ( -n, -c, -w, -6 или -N ) и ограничители (разделители) таблицы или представления. Параметр format должен использоваться в сочетании с опцией -f. Форматный файл позволяет вам сохранять определения программы BCP, чтобы вам не требовалось повторять их при последующем использовании BCP

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

    Вы можете использовать необязательные (дополнительные) параметры, перечисленые в табл. 24.2, для модифицирования работы программы BCP при выполнении массового копирования.

    Необязательные описатели массового копирования
    Параметр Описание
    -a размер_пакета Указывает количество байтов в сетевом пакете, передаваемом между клиентом и сервером
    -b размер_группы Указывает количество строк, которое нужно включить в группу (пакетное задание). Каждая группа копируется как одна транзакция. По умолчанию все строки файла данных копируются как одна группа с использованием одной фиксации. Этот параметр может понадобиться, когда вам нужно выполнять массовые вставки, чтобы освобождать блокировки таблиц, когда идет обработка таких групп, что позволит выполнять другую обработку
    -c Указывает, что BCP использует символьный тип данных
    -e файл_ошибок Указывает путь доступа к файлу ошибок, в котором протоколируются ошибки при работе BCP
    -f форматный_файл Указывает путь доступа к форматному файлу, который ранее использовался программой BCP. Форматный файл создается в том случае, если BCP запускается с параметром format, который описан выше. При использовании форматного файла другие параметры форматирования можно не указывать
    -h "подсказка [,.n]" Указывает подсказки, которые будут использоваться при массовом копировании. Это могут быть следующие подсказки:
  • ORDER (колонка [ASC | DESC] ). Указывает на сортировку данных в указанной колонке
  • ROWS_PER_BATCH = число. Указывает количество строк на одну группу (пакетное задание). Этот параметр аналогичен -b, но его не следует использовать в сочетании с -b. Параметр -b задает передачу указанной группы строк в SQL Server в виде одной транзакции. Если -b не указан, то весь файл данных передается на SQL Server в виде одной транзакции, а параметр ROWS_PER_BATCH используется для того, чтобы помочь SQL Server оценить объем нагрузки. Эта информация используется для оптимизации нагрузки внутренним образом
  • KILOBYTES_PER_BATCH = число. Указывает приблизительное количество килобайт на одну группу. Этот параметр аналогичен -b, но для указания размера группы используются килобайты, а не количество строк
  • TABLOCK. Указывает, что в течение массовой загрузки будет использоваться блокировка на уровне таблицы. Этот метод существенно повышает производительность загрузки за счет снижения конкуренции блокировок по данной таблице
  • CHECK_CONSTRAINTS. Указывает на необходимость проверки ограничений во время массовой загрузки. По умолчанию ограничения игнорируются
  • -i входной_файл Указывает имя файла ответов. Файл ответов содержит ответы на вопросы, задаваемые программой BCP, когда база данных работает в интерактивном режиме
    -k Указывает, что в пустые колонки заносятся значения null, а не значения по умолчанию
    -m максимум_ошибок Указывает, сколько ошибок должно произойти, чтобы BCP прекратила работу. Если этот параметр не указан, то используется значение по умолчанию, равное 10
    -n Указывает, что BCP использует собственные (native) типы данных
    -o выходной_файл Указывает выходной файл, в который поступает выходная информация программы BCP. Это обычный текстовый файл, который можно читать с помощью Notepad (Блокнота) или других утилит
    -q Указывает, что для имен таблицы и представления требуются заключенные в кавычки идентификаторы, содержащие символы, отличные от стандарта ANSI, такие как пробел
    -r разделитель_строк Указывает символ окончания строк. По умолчанию используется символ новой строки
    -t ограничитель_полей Указывает ограничитель полей. По умолчанию используется символ табуляции (tab)
    -v Выводит номер версии и информацию об авторских правах программы BCP
    -w Указывает, что BCP использует символы Unicode
    -C кодовая_страница Указывает кодовую страницу данных в файле данных
    -E Указывает, что копируемый файл содержит значения для идентификации колонок
    -F первая_строка Указывает первую строку, с которой начинается массовое копирование. Если этот параметр не указан, по первой строкой будет строка 1. Этот параметр полезно использовать, если вы хотите пропустить заголовочную информацию в файле данных
    -L последняя_строка Указывает последнюю строку для выполнения массового копирования. Принятое по умолчанию значение 0 указывает, что последней строкой для копирования является последняя строка файла данных. Этот параметр полезно использовать, если вы хотите копировать только определенное количество строк
    -N Указывает, что BCP использует собственные типы данных для несимвольных данных и Unicode для символьных данных
    -P пароль Указывает пароль для идентификатора учетной записи подключения (login ID), который используется в параметре -U.
    -R Указывает, что для денежных единиц, даты и времени используется региональный формат клиентской системы
    -S имя_сервера Указывает имя сервера, на который выполняется копирование
    -T Указывает, что используется доверяемое соединение. Если используется этот параметр, то переменные login_id и пароль не требуются; используются данные учетной записи пользователя сети
    -U login_id Указывает login ID пользователя (идентификатор учетной записи подключения), под которым будет выполняться копирование данных
    -V 60 | 65 | 70 Выполняет массовое копирование с использованием типов данных из более ранней версии SQL Server. Этот параметр следует использовать в сочетании с параметрами -c и -n
    -6 Указывает, что BCP использует типы данных Microsoft SQL Server 6 или Microsoft SQL Server 6.5

    Как видно из этой таблицы, для использования возможностей BCP можно задавать разнообразные параметры и комбинации этих параметров. Наилучшим способом ознакомления с этими параметрами является проработка примеров использования BCP, которые приводятся ниже.

    Использование BCP

    В этом разделе мы рассмотрим несколько примеров использования BCP для загрузки данных в SQL Server и из SQL Server. Эти примеры не охватывают все возможности, но они дадут вам хорошее представление о разнообразных режимах и методах работы с помощью BCP.

    Вы можете использовать BCP из командной строки, как это описано выше, или в интерактивном стиле. Для вызова BCP без какого-либо дополнительного взаимодействия с этой программой, вы должны задать параметр -n, -c, -w или -N. Если не указан ни один из этих параметров, то программа BCP будет работать в интерактивном режиме.

    Примечание.Во всех следующих примерах используется таблица Customers из базы данных Northwind.

    Загрузка данных путем интерактивного использования BCP

    Использование BCP для загрузки данных в интерактивном режиме может вызывать определенные трудности, поскольку этот метод требует, чтобы вы указывали ширину и типы колонок. Вы не обязаны это делать, если используете параметры командной строки, как это описано в следующем разделе. Хотя использование BCP в интерактивном режиме не рекомендуется, мы рассмотрим пример использования этого метода, чтобы вы имели полное представление о том, как работает BCP. В этом примере мы выполним копирование данных из файла data2.file в таблицу Customers базы данных Northwind с записью ошибок в файл err.file. Вы должны иметь заранее созданный файл данных data2.file. Этот файл содержит данные, которые вам нужно загрузить в таблицу Customers. Для запуска интерактивного сеанса в качестве системного администратора введите следующий оператор:

    bcp Northwind.dbo.Customers in data2.file -e err.file -Usa

    Затем у вас будет запрошен пароль. Введите пароль системного администратора (sa).

    Далее программа BCP будет запрашивать у вас информацию, касающуюся данных, которые вы хотите копировать. Ниже приводится пример интерактивного сеанса. Отметим, что ввод пользователя показан полужирным шрифтом.

    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 строк в сек.)

    Как видно из данного примера, вы должны знать эти значения, прежде чем начнете копирование. Когда программа BCP достигла конца файла, было выдано сообщение об ошибке, поскольку мы не указали количество строк для копирования.

    Загрузка данных программой BCP с помощью параметров командной строки

    Как уже говорилось, вам будет намного проще использовать BCP для загрузки данных, если вы будет использовать параметры командной строки. В примере этого раздела мы будем использовать BCP для загрузки данных из файла данных, состоящего из символьных колонок, разделенных символами табуляции (tab). Чтобы указать, что в файле данных используется символьный формат, мы будем использовать параметр -c. Кроме того, использование параметра -c позволяет выполнять BCP в неинтерактивном режиме. Следующая команда копирует 25 строк данных из файла данных data.file. в таблицу Customers базы данных Northwind:

    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, т.е. данные копировались в базу данных. Всегда имеет смысл указывать файл ошибок, в котором ведется журнал ошибок, возникших во время сеанса BCP. Если вы не указываете файл ошибок, эти ошибки выводятся на экран и, в конце концов, в результате прокрутки исчезают с экрана.

    Загрузка данных с помощью параметра -f (format)

    В нашем первом примере раздела "Использование BCP" мы создали форматный файл с именем data.fmt. Вместо ввода вручную всех параметров форматирования, таких как storage type (тип хранения), prefix length (длина префикса), 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

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

    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.)

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

    Извлечение данных с помощью BCP с параметрами командной строки

    Чтобы создать более удобный для чтения файл данных, в котором данные разделены символом табуляции, а каждая строка заканчивается символом новой строки, используйте параметр -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

    В нашем последнем примере для извлечения данных используется параметр 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. Это способ полезно использовать, если вы хотите извлечь только определенные колонки или строки базы данных.

    Оператор 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.

    Необязательные параметры для оператора 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. Указывается, что разделителем полей будет символ табуляции (несмотря на то, что он используется по умолчанию). В этом примере также указано, что во время процесса массовой вставки будут проверяться ограничения, а также задается блокировка таблицы на период загрузки. Транзакции, выполняющие загрузку, будут выполняться группами по пять строк.

    Службы преобразования данных Data Transformation Services (DTS)

    Средство DTS является частью SQL Server Enterprise Manager и предназначено для того, чтобы вы могли легко импортировать данные в базу данных и экспортировать данные из базы данных. DTS включает в себя двух мастеров: мастер импорта Import Wizard и мастер экспорта Export Wizard.* В этом разделе мы рассмотрим использование этих мастеров.

    Мастер Import Wizard

    Вы можете использовать Import Wizard для импорта данных в базу данных из различных источников данных. В отличие от программы BCP и оператора T-SQL BULK INSERT мастер Import Wizard может импортировать данные из источников, отличных от файлов данных. Чтобы использовать Import Wizard, выполните следующие шаги.

  • В окне Enterprise Manager раскройте группу серверов и щелкните на имени сервера, на который вы хотите импортировать данные. В меню Tools (Сервис) выберите пункт Wizards (Мастера). В диалоговом окне Select Wizard (Выбор мастера) раскройте папку Data Transformation Services (Службы преобразования данных), щелкните на DTS Import Wizard (Мастер импорта с помощью DTS) и затем щелкните на кнопке OK. В качестве альтернативного способа щелкните на имени сервера, укажите пункт All Tasks (Все задачи) и затем щелкните на пункте Import Data (Импорт данных). Появится начальное окно мастера Data Transformation Services Import/Export Wizard (рис. 24.2).(рис 24.2) Начальное окно мастера Data Transformation Services Import/Export Wizard
  • Щелкните на кнопке Next (Далее), чтобы появилось окно Choose а Data Source (Выберите источник данных) (рис. 24.3).(рис 24.3) Окно Choose а Data Source (Выберите источник данных)Здесь вы можете выбрать источник данных из раскрывающегося списка Source (Источник). На рис. 24.3 показан выбранный тип Text File (Текстовый файл). Вы можете выбрать источник данных из следующих вариантов:
  • dBase
  • Microsoft Access
  • Microsoft Data Link
  • Microsoft Excel
  • Microsoft Visual FoxPro
  • Other (ODBC data source) (Другой [источник данных ODBC])
  • Other OLE_DB data source (Другие источники данных OLE_DB)
  • Paradox
  • Data files (Файлы данных)
  • Варианты выбора частично зависят от драйверов ODBC, которые вы инсталлировали в вашей системе. Например, если у вас инсталлирован драйвер Oracle ODBC, в списке будет также представлен провайдер OLE DB provider for Oracle. Окно Choose a Data Source изменяется в зависимости от выбранного вами источника данных. Независимо от выбранного вами источника потребуется ввести информацию о файле и (иногда) информацию для входа (имя пользователя и пароль).
  • Щелкните на кнопке Next, чтобы появилось окно Select file format (Выбор формата файла) (рис. 24.4). (Окно Select file format появляется только в том случае, если выбран тип файла Text File.) В этом окне вы можете выбрать формат файла. Ниже описываются параметры этого окна:
  • Кнопки выбора Delimited (С ограничителями) и Fixed field (Поле фиксированной ширины) позволяют вам выбрать формат входного файла, а также определенный символ-ограничитель или фиксированную ширину полей.
  • В раскрывающемся списке File type (Тип файла) вы можете выбрать тип кодировки для входного файла: ANSI, OEM или Unicode.(рис 24.4) Окно Select file format (Выбор формата файла)
  • В раскрывающемся списке Row delimiter (Разделитель строк) вы можете указать символ, который используется как признак конца каждой строки входного файла.
  • В раскрывающемся списке Text qualifier (Описатель текста) вы можете указать ограничитель текста в файле с ограничителями.
  • В прокручиваемом списке Skip rows (Пропустить строки) вы можете указать, сколько строк нужно пропустить в начале входного файла.
  • Флажок First row has column names (Первая строка содержит имена колонок) указывает, что первая строка содержит не данные, а названия, и ее нужно пропустить.
  • Выберите вариант Delimited для формата файла, символы {CR}{LF} для разделителя строк (Row delimiter) и вариант <none> (нет) в списке Text qualifier. Затем щелкните на кнопке Next, чтобы появилось окно Specify Column Delimiter (Указание ограничителя колонок) (рис. 24.5). (Если щелкнуть на кнопке выбора Fixed Field вместо Delimited, то появится окно Fixed Field Column Positions (Позиции колонок полей фиксированной ширины).) Это окно удобно для указания ограничителя колонок, поскольку вы получаете немедленный результат в зависимости от вашего выбора, который показывает, насколько подходит ваш выбор. Вы можете использовать запятую (кнопка выбора Comma), точку с запятой (Semicolon) или любой другой ограничитель. После выбора ограничителя в окне Preview (Просмотр) появляются строки. Это позволяет вам увидеть, насколько подходит выбранный вами ограничитель для данных входного файла.
  • После выбора ограничителя щелкните на кнопке Next, чтобы появилось окно Choose a Destination (Выбор получателя данных) (рис 24.6(рис 24.6) Окно Specify Column Delimiter (Указание ограничителя колонок)(рис 24.5) Окно Choose a Destination (Выбор получателя данных)
  • Щелкните на кнопке Next, чтобы появилось окно Select Source Tables and Views (Выбор исходных таблиц и представлений) (рис. 24.7). В этом окне вам нужно выбрать из раскрывающегося списка колонки Destination таблицу, в которую будут загружаться данные. Вы можете предварительно просмотреть эти данные, щелкнув на кнопке Preview. Вы можете также использовать кнопки Select All (Выбрать все) и Deselect All (Отменить весь выбор), чтобы выбрать все таблицы или не выбирать ни одной таблицы.(рис 24.7) Окно Select Source Tables and Views (Выбор исходных таблиц и представлений)
  • В том же окне вы имеете доступ к службам преобразования. Эти службы позволяют вам преобразовывать данные (изменять колонки и т.д.) при выполнении импорта. Для преобразования данных сначала щелкните на кнопке Transform (Преобразование) (кнопка с тремя точками под словом Transform), чтобы открыть диалоговое окно Column Mappings and Transformations (Отображение и преобразование колонок) (рис. 24.8). Во вкладке Column Mappings (Отображение колонок) вы можете выбрать создание новой таблицы (кнопка выбора Create destination table) либо удаление строк (Delete rows) или добавление строк (Append rows) в существующей таблице. Вариант Append rows to destination table (Добавление строк к таблице-получателю) принят по умолчанию. Если выбрать создание новой таблицы, то с помощью кнопки Edit SQL (Редактировать SQL) вы можете просматривать и модифицировать оператор SQL, который будет использоваться для создания этой таблицы.
  • Щелкните на вкладке Transformations для просмотра параметров преобразования (рис. 24.9). В окне этой вкладки вы можете выбрать копирование непосредственно в колонки таблицы (Copy the source columns directly ...) или преобразование информации во время ее копирования (Transform information as it is copied). Здесь указаны такие способы преобразования, как преобразование точности (16-битные данные в 32-битные, 32-битные в 16-битные). Можно также задавать преобразование значений null (NOT NULL to NULL, NULL to NOT NULL).
  • Щелкните на кнопке OK, чтобы закрыть это диалоговое окно, и щелкните на кнопке Next, чтобы появилось окно Save, schedule, and replicate package (Сохранение, планирование запуска и репликация пакета) (рис 24.10(рис 24.9) Вкладка Column Mappings (Отображение колонок) диалогового окна Column Mappings and Transformations (Отображение и преобразование колонок)(рис 24.8) Вкладка Transformations диалогового окна Column Mappings and Transformations
  • Щелкните на кнопке Next, чтобы появилось окно Completing the DTS Import Wizard (Завершение работы мастера импорта DTS) (рис 24.11(рис 24.11) Окно Save, schedule, and replicate package (Сохранение, планирование запуска и репликация пакета)(рис 24.10) Окно Completing the DTS Import Wizard (Завершение работы мастера импорта DTS)
  • После щелчка на кнопке Finish вы увидите окно Executing Package (Идет выполнение пакета) (рис. 24.12). Затем появится окно сообщения, информирующее вас, что копирование данных завершено или возникла ошибка.
  • Как видно из описания, мастер DTS Import Wizard превращает выполнение импорта данных в простую процедуру. Однако при повторяемом выполнении этой задачи более эффективным будет создание сценария, поскольку он наиболее подходит для быстрого и простого многократного использования. Файл сценария создается путем сохранения оператора BULK INSERT в .sql-файле.

    (рис 24.12) Окно Choose a Destination (Выбор получателя данных)

    Мастер Export Wizard

    Вы можете использовать мастер Export Wizard для экспорта данных из базы данных во внешние хранилища данных. В отличие от программы BCP, мастер Export Wizard может также экспортировать данные в хранилища, отличные от файлов данных. Для использования Export Wizard выполните следующие шаги.

  • В окне Enterprise Manager раскройте группу серверов и щелкните на имени сервера, с которого вы хотите экспортировать данные. В меню Tools выберите пункт Wizards (Мастера). В диалоговом окне Select Wizard раскройте папку Data Transformation Services, щелкните на DTS Export Wizard (Мастер экспорта с помощью DTS) и затем щелкните на кнопке OK. В качестве альтернативного способа щелкните на имени сервера, укажите пункт All Tasks (Все задачи) и затем щелкните на пункте Export Data (Экспорт данных). Появится начальное окно мастера Data Transformation Services Import/Export Wizard (рис. 24.13).(рис 24.13) Начальное окно Data Transformation Services Import/Export Wizard
  • Щелкните на кнопке Next, чтобы появилось окно Choose a Data Source (рис. 24.14). В этом окне вы можете указать источник данных. Вы можете оставить вариант по умолчанию (Microsoft OLE DB Provider for SQL Server) или выбрать вариант Microsoft ODBC Driver for SQL Server. При любом варианте произойдет подсоединение к SQL Server. Для экспорта данных из других систем управления базами данных можно использовать другие варианты. Затем выберите базу данных – в данном случае базу данных Northwind. Вы можете также задать дополнительные параметры, такие как тайм-аут соединения, сетевой адрес, сетевые библиотеки и идентификатор рабочей станции, в окне, которое появится, если щелкнуть на кнопке Advanced. Однако эти параметры обычно не требуется модифицировать.(рис 24.14) Окно Choose a Data Source (Выбор источника данных)
  • Щелкните на кнопке Next, чтобы появилось окно Choose a Destination (Выбор получателя) (рис. 24.15). Параметры этого окна варьируются в зависимости от типа данных выбранного вами получателя данных; однако в большинстве случаев вам потребуется ввести данные для входа и информацию о файле. В данном случае мы выберем вариант получателя данных Text File (Текстовый файл), который не требует данных для входа, поэтому мы сможем сохранить таблицу базы данных в текстовой форме. Введите имя выходного файла в текстовом поле File name (Имя файла).
  • Щелкните на кнопке Next, чтобы появилось окно Specify Table Copy or Query (Копия таблицы или запрос) (рис. 24.16). В этом окне вы можете выбрать между экспортом всей таблицы (кнопка выбора Copy table(s)...) или экспортом, осуществляемым через запрос (кнопка выбора Use a query...). Если в качестве получателя данных выбрана другая база данных SQL Server, то станет доступна третья кнопка выбора – Copy objects and data between SQL Server databases (Копировать объекты и данные между базами данных SQL Server).

    Если щелкнуть на кнопке выбора Use a query to specify the data to transfer (Использовать запрос для указания данных, подлежащих копированию) и затем щелкнуть на кнопке Next, то появится окно Type SQL Statement (Введите оператор SQL) (рис. 24.17). Здесь вы можете ввести оператор, который осуществит выбор данных для экспорта. С помощью этого запроса можно выбрать подмножество колонок или строк или выбрать всю таблицу, как это показано в данном примере.

    (рис 24.16) Окно Choose a Destination (Выбор получателя)(рис 24.15) Окно Specify Table Copy or Query (Копия таблицы или запрос)(рис 24.17) Окно Type SQL Statement (введите оператор SQL))
  • Щелкните на кнопке Next, чтобы появилось окно Select destination file format (Выбор формата выходного файла) ((рис. 24.18). (Раскрывающийся список Source не появится в этом окне, если вы вошли в это окно из окна Type SQL Statement.) Здесь вы можете задать несколько параметров форматирования для выходного файла, включая выбор между файлом с ограничителями и файлом с полями фиксированной ширины. По окончании выбора параметров форматирования щелкните на кнопке Next.

    Если щелкнуть на кнопке выбора Copy table(s) and view(s) from the source database (Копировать таблицу(ы) и представление(я) из исходной базы данных) в окне Specify Table Copy Or Query и щелкнуть на кнопке Next, то появится окно Select destination file format (рис. 24.18). (В данном случае в окне появится раскрывающийся список Source.) В этом окне вам нужно выбрать исходную таблицу, а также выбрать параметры форматирования для выходного файла. По окончания щелкните на кнопке Next.

    (рис 24.18) Окно Select destination file format
  • После щелчка на кнопке Next в окне Select destination file format появится окно Save, schedule, and replicate package (рис. 24.19). Здесь вы можете выбрать между запуском этого задания и сохранением DTS-пакета для будущего использования. Это окно является аналогом соответствующего окна мастера Import Wizard.
  • Щелкните на кнопке Next, чтобы появилось окно Completing the DTS Export Wizard (рис. 24.20). Щелкните на кнопке Finish для запуска экспорта.
  • После щелчка на кнопке Finish в окне мастера Export Wizard начнется выполнение процесса экспорта данных. Как и в случае мастера Import Wizard появится окно Executing Package (рис. 24.21). Затем появится окно сообщения, где говорится об успешном или неуспешном завершении данной работы.
  • Оба мастера – Import Wizard и Export Wizard – просты для использования и конфигурирования; они позволяют упростить работу, временами сопряженную с трудностями при использовании других средств. Но следует помнить, что если вам требуется повторное выполнение этих операций, то стоит приложить дополнительные усилия для их реализации в виде сценария. Вы можете создать сценарий, в который входит оператор SQL BULK INSERT, для выполнения нужной операции импорта, или использовать оператор SELECT, где выходные результаты перенаправлены в файл данных, для выполнения операции экспорта.

    (рис 24.20) Окно Save, schedule, and replicate package(рис 24.19) Окно Completing the DTS Export WizardПримечание. Хотя мы использовали в предыдущих примерах использования мастеров Import Wizard и Export Wizard передачу данных из текстового файла в таблицу базы данных и из таблицы в текстовый файл, эти мастера поддерживают также много других типов передачи данных. Эти мастера особенно полезны для передачи данных между базами данных или другими объектами. (рис 24.21) Окно Executing Package

    Переходные таблицы

    Переходные таблицы – это временные таблицы, которые вы создаете для загрузки данных в SQL Server, для обработки и манипулирования этими данными, а также для копирования этих данных в соответствующую таблицу или таблицы в базе данных. В этом разделе вы узнаете, как и когда использовать переходные таблицы.

    Основы использования переходных таблиц

    Переходная таблица – это временная область хранения базы данных, в которую вы можете копировать данные. Затем вы можете использовать T-SQL для преобразования данных в нужный формат путем выполнения таких операций, как операции объединения, использующие переходную таблицу и существующие таблицы.

    Возможность обработки данных во время процесса загрузки в переходные таблицы позволяет вам обходить определенные ограничения методов загрузки данных. Большинство методов загрузки данных позволяют вам только копировать данные в базу данных без какой-либо обработки. Используя DTS, вы можете выполнять некоторые преобразования данных, но не можете вносить изменения, основываясь на данных, содержащихся в базе данных. Главным преимуществом использования переходных таблиц является то, что вы получаете возможность выполнения операций объединения (слияния), используя при этом информацию, содержащуюся в самой переходной таблице или в существующих таблицах.

    Использование переходных таблиц

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

    Слияние и загрузка таблицы

    Рассмотрим таблицу "рынка" данных (data mart), которая является комбинацией двух таблиц из систем оперативной обработки транзакций (OLTP). Эта таблица содержит колонки A, B, C, D и E; колонки A, B и C существуют в одной таблице и колонки C, D и E – в другой таблице. Обе входные таблицы можно сделать переходными, а для загрузки общей таблицы в рынок данных можно использовать операцию слияния (рис. 24.22).

    (рис 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, для параметра базы данных 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. Данные извлекаются из таблицы stage.

    Заключение

    В этой главе вы узнали, как загружать базу данных SQL Server с помощью программы BCP, оператора BULK INSERT и средств DTS. Вы также ознакомились с переходными таблицами, которые удобно использовать при определенных условиях. И вы узнали, как использовать оператор SELECT...INTO. Эти средства и методы, несомненно, помогут вам, поскольку загрузка базы данных является одной из основных задач для DBA. В главе 25 вы узнаете о компонентах Distributed Transaction Coordinator и Microsoft Transaction Server.

    Вернуться к учебному плану