Выполнение операций массового копирования

Функция массового копирования SQL Server поддерживает передачу больших объемов данных в таблицу или представление SQL Server или из них. Данные можно также передать путем указания инструкции SELECT. Данные можно передавать между SQL Server и файлом данных операционной системы, таким как ASCII-файл. Файлы данных могут иметь различные форматы. Формат определяется для массового копирования в файле форматирования. По желанию данные можно загрузить в переменные программы и передать в SQL Server с помощью функций и методов массового копирования.

На сайте CodePlex имеется образец приложения, демонстрирующий использование этой возможности; дополнительные сведения см. в разделе Образцы компонента SQL Server Database Engine.

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

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

    Такой файл называется файлом данных собственного режима.

  • Массовое копирование из таблицы, представления или результирующего набора инструкции Transact-SQL в файл данных, куда данные помещаются в формате, отличном от формата в таблице или представлении.

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

  • Массовое копирование из файлов данных в таблицу или представление.

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

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

Файлы данных, используемые функциями массового копирования, не приходится создавать при помощи другой программы массового копирования. Любая другая система может создать файл данных и файл форматирования в соответствии с определениями массового копирования. Эти файлы можно затем использовать в программе массового копирования SQL Server для импорта данных в SQL Server. Например, можно экспортировать данные из электронной таблицы в файл с разделителями-символами табуляции, построить файл форматирования, описывающий файл с разделителями-символами табуляции, а затем использовать функции массового копирования для быстрого импорта данных в SQL Server. Файлы данных, созданные при массовом копировании, можно также импортировать в другие приложения. Например, можно использовать функции массового копирования для экспорта данных из таблицы или представления в файл с разделителями-символами табуляции, который затем можно загрузить в электронную таблицу.

ПримечаниеПримечание

Начиная с SQL Server 2005, при использовании программы bcp сервер сообщает об ошибке, если происходит усечение числовых данных. SQL Server 2000 и более ранние версии выдают только предупреждение. Это может создать проблемы для существующих приложений, пропускающих предупреждения. Этих проблем можно избежать, если гарантировать, что входные данные имеют правильные значения, которые не будут усечены, или если продолжать использовать версию программы bcp из SQL Server 2000.

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

Ограничения

Определяемый пользователем тип данных CLR должен быть привязан как двоичные данные. Даже если файл форматирования указывает SQLCHAR как тип данных для целевого столбца определяемого пользователем типа, программа bcp будет рассматривать данные как двоичные.

Нельзя использовать инструкцию SET FMTONLY OFF с операциями массового копирования. Ее использование может стать причиной завершения операции массового копирования с ошибкой или получению непредвиденных результатов.

Поставщик OLE DB для собственного клиента SQL Server

В поставщике OLE DB для собственного клиента SQL Server реализовано два метода выполнения операций массового копирования с базой данных SQL Server. Первый метод предусматривает использование интерфейса IRowsetFastLoad для операций массового копирования, работающих с памятью, а второй предусматривает использование интерфейса IBCPSession для операций массового копирования, работающих с файлами.

Использование операций массового копирования, работающих с памятью

В поставщике OLE DB для собственного клиента SQL Server реализован интерфейс IRowsetFastLoad, предоставляющий поддержку операций массового копирования SQL Server, работающих с памятью. В интерфейсе IRowsetFastLoad реализованы методы IRowsetFastLoad::Commit и IRowsetFastLoad::InsertRow.

Включение сеанса для метода IRowsetFastLoad

Потребитель уведомляет поставщик OLE DB собственного клиента SQL Server о необходимости массового копирования путем установки для свойства источника данных SSPROP_ENABLEFASTLOAD, зависящего от поставщика OLE DB для собственного клиента OLE DB SQL Server, значения VARIANT_TRUE. При задании свойства на источник данных потребитель создает сеанс поставщика OLE DB для собственного клиента SQL Server. Новый сеанс позволяет потребителю получить доступ к интерфейсу IRowsetFastLoad.

ПримечаниеПримечание

Если для инициализации источника данных используется интерфейс IDataInitialize, затем необходимо задать свойство SSPROP_IRowsetFastLoad в параметре rgPropertySets метода IOpenRowset::OpenRowset, в противном случае вызов метода OpenRowset возвращает E_NOINTERFACE.

Включение сеанса для массового копирования ограничивает поддержку интерфейсов в сеансе со стороны поставщика OLE DB для собственного клиента SQL Server. Сеанс с включенным массовым копированием предоставляет только следующие интерфейсы:

  • IDBSchemaRowset

  • IGetDataSource

  • IOpenRowset

  • ISupportErrorInfo

  • ITransactionJoin

Чтобы отключить создание набора строк с включенным массовым копированием и вернуть сеанс поставщика OLE DB для собственного клиента SQL Server к обычной обработке, задайте для свойства SSPROP_ENABLEFASTLOAD значение VARIANT_FALSE.

Наборы строк IRowsetFastLoad

Наборы строк для массового копирования поставщика OLE DB для собственного клиента SQL Server доступны только для записи, но они предоставляют интерфейсы, позволяющие потребителю определить структуру таблицы SQL Server. Для набора строк поставщика OLE DB для собственного клиента SQL Server с включенным массовым копированием предоставлены следующие интерфейсы:

  • IAccessor

  • IColumnsInfo

  • IColumnsRowset

  • IConvertType

  • IRowsetFastLoad

  • IRowsetInfo

  • ISupportErrorInfo

Свойства SSPROP_FASTLOADOPTIONS, SSPROP_FASTLOADKEEPNULLS и SSPROP_FASTLOADKEEPIDENTITY, зависящие от поставщика, управляют режимом работы набора строк для массового копирования поставщика OLE DB для собственного клиента SQL Server. Свойства указаны в элементе rgProperties элемента параметра rgPropertySets интерфейса IOpenRowset

Cвойство

Описание

SSPROP_FASTLOADKEEPIDENTITY

Столбец: нет

Чтение-запись: чтение и запись

Тип: VT_BOOL

По умолчанию: VARIANT_FALSE

Описание: Поддерживает значения идентификаторов, указанные потребителем.

VARIANT_FALSE: Значения для столбца идентификаторов в таблице SQL Server формируются SQL Server. Любое значение, привязанное к столбцу, не учитывается поставщиком OLE DB для собственного клиента SQL Server.

VARIANT_TRUE: Потребитель привязывает метод доступа, предоставляющий значение, к столбцу идентификаторов SQL Server. Свойство идентификатора недоступно для столбцов, допускающих значение NULL, так что потребитель предоставляет уникальное значение для каждого вызова IRowsetFastLoad::Insert.

SSPROP_FASTLOADKEEPNULLS

Столбец: нет

Чтение-запись: чтение и запись

Тип: VT_BOOL.

По умолчанию: VARIANT_FALSE

Описание: Поддерживает значение NULL для столбцов с ограничением DEFAULT. Затрагивает только столбцы SQL Server, которые допускают значение NULL и к которым применено ограничение DEFAULT.

VARIANT_FALSE: SQL Server вставляет значение по умолчанию для столбца при вставке потребителем поставщика OLE DB для собственного клиента SQL Server строки, содержащей значение NULL для столбца.

VARIANT_TRUE: SQL Server вставляет в столбец значение NULL, когда пользователь поставщика OLE DB собственного клиента SQL Server вставляет строку, содержащую в этом столбце значение NULL.

SSPROP_FASTLOADOPTIONS

Столбец: нет

Чтение-запись: чтение и запись

Тип: VT_BSTR

По умолчанию: нет

Описание: Это свойство похоже на параметр -h "подсказка[,...n]" программы bcp. Следующие строки можно использовать в качестве параметров при массовом копировании данных в таблицу.

ORDER(столбец[ASC | DESC][,...n]): порядок сортировки данных в файле данных. Производительность массового копирования увеличивается, если загружаемый файл данных упорядочен по кластеризованному индексу таблицы.

ROWS_PER_BATCH = bb: количество строк данных на пакет (значение bb). Сервер оптимизирует массовую загрузку в соответствии со значением bb. По умолчанию значение ROWS_PER_BATCH не известно.

KILOBYTES_PER_BATCH = cc: количество килобайт(KB) данных в каждом пакете (значение cc). По умолчанию значение KILOBYTES_PER_BATCH неизвестно.

TABLOCK: блокировка уровня таблицы запрашивается на время операции массового копирования. Применение этого параметра значительно повышает производительность, так как удержание блокировки только в течение операции массового копирования уменьшает вероятность конфликтов блокировок в таблице. Таблица может загружаться одновременно несколькими клиентами, если она не содержит индексов и указан параметр TABLOCK. По умолчанию работа блокировки определяется параметром таблицы table lock on bulk load.

CHECK_CONSTRAINTS: любые ограничения на имя_таблицы проверяются на протяжении операции массового копирования. По умолчанию ограничения не учитываются.

FIRE_TRIGGER: в SQL Server 2000 с включенными триггерами оптимизация записи в журнал была невозможна, так как логика триггера была основана на записях журнала. На протяжении операции массового импорта с включенными триггерами все оптимизации массовых операций записи в журнал (включая блокировки массового обновления BU) были отключены.

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

Использование операций массового копирования, работающих с файлами

В поставщике OLE DB для собственного клиента SQL Server предусмотрен интерфейс IBCPSession, предоставляющий поддержку операций массового копирования SQL Server, работающих с файлами. В интерфейсе IBCPSession реализованы методы IBCPSession::BCPColFmt, IBCPSession::BCPColumns, IBCPSession::BCPControl, IBCPSession::BCPDone, IBCPSession::BCPExec, IBCPSession::BCPInit, IBCPSession::BCPReadFmt и IBCPSession::BCPWriteFmt.

Драйвер ODBC для собственного клиента SQL Server

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

Журнал изменений

Обновленное содержимое

Обновлена ссылка на образец.