Поделиться через


Использование собственного формата для импорта и экспорта данных

Собственный формат данных рекомендуется использовать во время массовой передачи данных между несколькими экземплярами Microsoft SQL Server при помощи файла данных, не содержащего символы в расширенной кодировке или символы в двухбайтовой кодировке (DBCS).

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

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

В собственном формате используются собственные типы данных базы данных. Собственный формат предназначен для высокоскоростной передачи данных между таблицами SQL Server. Если используется файл форматирования, то исходная и целевая таблицы не обязаны быть идентичными. Передача данных происходит в два этапа:

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

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

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

Ограничения

Чтобы успешно импортировать данные в собственный формат, убедитесь, что:

  • Файл данных создан в собственном формате.

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

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

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

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

Успешный импорт не приводит к повреждению целевой таблицы.

Как bcp обрабатывает данные в собственном формате

В этом разделе обсуждаются особые аспекты выполнения программой bcp операций экспорта и импорта данных в собственном формате.

  • Несимвольные данные.

    Программа bcp использует для записи несимвольных данных из таблицы в файл данных внутренний двоичный формат данных SQL Server.

  • Данные типа char или varchar.

    В начале каждого поля char или varchar программа bcp добавляет длину префикса.

    Важное примечаниеВажно!

    По умолчанию при использовании собственного режима программа bcp перед копированием в файл данных преобразует символы из формата SQL Server в символы OEM. Программа bcp преобразует символы из файла данных в символы ANSI перед их массовым импортом в таблицу SQL Server. Во время подобных преобразований расширенные символьные данные могут быть потеряны. Для расширенных наборов символов необходимо либо использовать собственный формат в Юникоде, либо задать кодовую страницу. Дополнительные сведения об использовании кодовой страницы см. в разделе Копирование данных между различными параметрами сортировки.

  • Данные sql_variant.

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

    Если в столбце назначения тип данных отличается от sql_variant, то каждое значение данных преобразуется в тип данных столбца назначений согласно стандартным правилам неявного преобразования данных. При возникновении ошибки во время преобразования данных происходит откат текущего пакета. С любыми значениями char и varchar, передающимися между столбцами sql_variant, могут возникнуть проблемы преобразования кодовых страниц. Дополнительные сведения см. в разделе Копирование данных между различными параметрами сортировки.

    Дополнительные сведения относительно преобразования данных см. в разделе Преобразование типов данных (компонент Database Engine).

Параметры командной строки для собственного формата

Импортировать данные собственного формата в таблицу можно при помощи bcp, BULK INSERT или INSERT ... SELECT * FROM OPENROWSET(BULK...). Для команды bcp или инструкции BULK INSERT формат данных можно указать в командной строке. Для инструкции INSERT ... SELECT * FROM OPENROWSET(BULK...) нужно указать формат данных в файле форматирования.

Собственный формат поддерживается следующими параметрами командной строки:

Команда

Способ

Описание

bcp

-n

Приводит к использованию программой bcp собственных типов данных.1

BULK INSERT

DATAFILETYPE ='native'

Использует собственный тип данных или расширенный собственный тип данных. Учтите, что параметр DATAFILETYPE не нужен, если типы данных указываются в файле форматирования.

1 Для преобразования собственных (-n) данных в совместимый с предыдущими версиями клиентов SQL Server формат используйте ключ -V. Дополнительные сведения см. в разделе Импорт данных в собственном и символьном формате из предыдущих версий SQL Server.

Дополнительные сведения см. в разделах Программа bcp, BULK INSERT (Transact-SQL) и OPENROWSET (Transact-SQL).

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

В файле форматирования также может указываться форматирование для каждого поля. Дополнительные сведения см. в разделе Файлы форматирования для импорта или экспорта данных.

Примеры

В следующих примерах показан массовый экспорт данных в собственном формате при помощи программы bcp, а также массовый импорт тех же данных при помощи инструкции BULK INSERT.

Образец таблицы

Для данного примера необходимо, чтобы таблица myTestNativeData существовала в образце базы данных AdventureWorks в схеме dbo. Перед выполнением примеров следует создать эту таблицу. В редакторе запросов среды Среда SQL Server Management Studio выполните:

USE AdventureWorks2008R2;
GO
CREATE TABLE myTestNativeData (
   Col1 smallint,
   Col2 nvarchar(50),
   Col3 nvarchar(50)
   ); 

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

INSERT INTO myTestNativeData(Col1,Col2,Col3)
   VALUES(1,'DataField2','DataField3');
INSERT INTO myTestNativeData(Col1,Col2,Col3)
   VALUES(2,'DataField2','DataField3');
GO
SELECT Col1,Col2,Col3 FROM myTestNativeData

Массовый экспорт собственных данных с помощью программы bcp

Для экспорта данных из таблицы в файл данных используйте bcp с параметром out и следующими квалификаторами:

Квалификаторы

Описание

-n

Указывает собственные типы данных.

-T

Указывает, что программа bcp устанавливает доверительное соединение с SQL Server с использованием встроенной системы безопасности. Если параметр -T не задан, для успешного входа необходимо указать параметры -U и -P.

В следующем примере выполняется массовый экспорт данных в собственном формате из таблицы myTestNativeData в новый файл данных myTestNativeData-n.Dat. В командной строке Microsoft Windows введите:

bcp AdventureWorks2008R2..myTestNativeData out C:\myTestNativeData-n.Dat -n -T

Массовый импорт собственных данных с помощью инструкции BULK INSERT

Следующий пример использует инструкцию BULK INSERT для импорта данных из файла данных myTestNativeData-n.Dat в таблицу myTestNativeData. В редакторе запросов среды Среда SQL Server Management Studio выполните следующий запрос:

USE AdventureWorks2008R2;
GO
BULK INSERT myTestNativeData 
    FROM 'C:\myTestNativeData-n.Dat' 
   WITH (DATAFILETYPE='native'); 
GO
SELECT Col1,Col2,Col3 FROM myTestNativeData
GO