Использование символьного формата Юникода для импорта и экспорта данных (SQL Server)

Применимо к: SQL Server Azure SQL DatabaseУправляемый экземпляр SQL AzureAzure Synapse Analytics AnalyticsPlatform System (PDW)

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

  • Если данные источника и назначения имеют тип данных Юникода, при использовании символьного формата Юникода все символьные данные сохраняются.

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

В этом разделе.
Рекомендации по использованию символьного формата Юникода
Особые рекомендации по использованию символьного формата Юникода, bcp и файла форматирования
Параметры команд для символьного формата Юникода
Пример условий теста
 ● Пример таблицы
 ● Пример файла форматирования, отличного от XML
Примеры
 ● Использование bcp и символьного формата Юникода для экспорта данных
 ● Использование bcp и символьного формата Юникода для импорта данных без файла форматирования
 ● Использование bcp и символьного формата Юникода для импорта данных с помощью файла форматирования, отличного от XML
 ● Использование BULK INSERT и символьного формата Юникода без файла форматирования
 ● Использование BULK INSERT и символьного формата Юникода с файлом форматирования, не являющимся XML
 ● Использование OPENROWSET и символьного формата Юникода с файлом форматирования, не являющимся XML
Связанные задачи

Рекомендации по использованию символьного формата Юникода

При использовании символьного формата Юникода имейте в виду следующее.

  • По умолчанию программа bcp разделяет символьные поля данных символом табуляции, а записи — символом перевода строки. Сведения о том, как указать альтернативные признаки конца, см. в разделе Указание признаков конца поля и строки (SQL Server).

  • Данные типа sql_variant , хранящиеся в файле данных символьного формата Юникод, обрабатываются таким же образом, что и данные файла данных символьного формата, за исключением того, что они хранятся как данные типа данных nchar , а не как данные типа char . Дополнительные сведения о формате символов см. в разделе Поддержка параметров сортировки и Юникода.

Особые рекомендации по использованию символьного формата Юникода, bcp и файла форматирования

Файлы данных символьного формата Юникода следуют соглашениям для файлов Юникода. Первые два байта файла являются шестнадцатеричными числами 0xFFFE. Эти байты служат в качестве меток порядка байтов, определяющих, хранится ли старший байт в файле первым или последним. Программа bcp может неправильно интерпретировать метки порядка байтов и вызвать сбой части импорта. Вы можете получить сообщение об ошибке, аналогичное следующему:

Starting copy...
SQLState = 22005, NativeError = 0
Error = [Microsoft][ODBC Driver 13 for SQL Server]Invalid character value for cast specification

Метки порядка байтов могут быть неправильно интерпретированы при следующих условиях:

  • для указания символа Юникода используется программа bcp и параметр -w ;

  • используется файл форматирования;

  • первое поле в файле данных не содержит символы.

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

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

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

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

Get-Help Параметр Описание
bcp -w Использует символьный формат Юникода.
BULK INSERT DATAFILETYPE ="widechar" Использует символьный формат Юникода при массовом импорте данных.
OPENROWSET Недоступно Требуется использовать файл форматирования.

Примечание

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

Пример условий теста

Примеры в этой статье основаны на таблице и файле форматирования, которые определены ниже.

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

Приведенный ниже скрипт создает тестовую базу данных, таблицу с именем myWidechar и заполняет таблицу начальными значениями. Выполните следующий запрос Transact-SQL в Microsoft SQL Server Management Studio (SSMS):

CREATE DATABASE TestDatabase;
GO

USE TestDatabase;
CREATE TABLE dbo.myWidechar ( 
	PersonID smallint NOT NULL,
	FirstName nvarchar(25) NOT NULL,
	LastName nvarchar(30) NOT NULL,
	BirthDate date,
	AnnualSalary money
);

-- Populate table
INSERT TestDatabase.dbo.myWidechar
VALUES 
(1, N'ϴAnthony', N'Grosse', '02-23-1980', 65000.00),
(2, N'❤Alica', N'Fatnowna', '11-14-1963', 45000.00),
(3, N'☎Stella', N'Rossenhain', '03-02-1992', 120000.00);

-- Review Data
SELECT * FROM TestDatabase.dbo.myWidechar;

Образец файла форматирования в формате, отличном от XML

SQL Server поддерживает два типа файлов форматирования: файлы форматирования в формате, отличном от XML, и XML-файлы форматирования. Файл форматирования не в формате XML поддерживается более ранними версиями SQL Server. Дополнительные сведения см. в разделе Файлы формата, отличные от XML (SQL Server) . Следующая команда будет использовать служебную программу bcp для создания файла форматирования myWidechar.fmtв формате, отличном от XML, на основе схемы myWidechar. Чтобы создать файл форматирования с помощью служебной программы bcp , укажите аргумент format , а вместо пути файла данных задайте значение nul . Параметр format также требует наличия параметра -f . Кроме того, в этом примере квалификатор c используется для указания символьных данных, а T используется для указания доверенного подключения, в рамках которого применяется встроенная система безопасности. В командной строке введите следующие команды:

bcp TestDatabase.dbo.myWidechar format nul -f D:\BCP\myWidechar.fmt -T -w

REM Review file
Notepad D:\BCP\myWidechar.fmt

Важно!

Убедитесь, что файл форматирования не в формате XML заканчивается символом перевода строки или возврата каретки. В противном случае, скорее всего, появится следующее сообщение об ошибке:

SQLState = S1000, NativeError = 0
Error = [Microsoft][ODBC Driver 13 for SQL Server]I/O error while reading BCP format file

Примеры

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

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

Параметр -w и команда OUT . Примечание. Файл данных, созданный в этом примере, будет использоваться во всех последующих примерах. В командной строке введите следующие команды:

bcp TestDatabase.dbo.myWidechar OUT D:\BCP\myWidechar.bcp -T -w

REM Review results
NOTEPAD D:\BCP\myWidechar.bcp

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

Параметр -w и команда IN . В командной строке введите следующие команды:

REM Truncate table (for testing)
SQLCMD -Q "TRUNCATE TABLE TestDatabase.dbo.myWidechar;"

REM Import data
bcp TestDatabase.dbo.myWidechar IN D:\BCP\myWidechar.bcp -T -w

REM Review results is SSMS

Использование bcp и символьного формата Юникода для импорта данных с файлом форматирования, не являющимся XML

Параметры -w и -f switches и IN commи. Так как этот пример включает bcp, файл форматирования, символ Юникода, а первое поле данных в файле данных не содержит символы, потребуется использовать обходной путь. См. раздел Особые рекомендации по использованию символьного формата Юникода, bcp и файла форматированиявыше. Файл myWidechar.bcp данных будет изменен путем добавления дополнительной записи в качестве фиктивной записи, которая затем будет пропущена с параметром -F 2 .

В командной строке введите следующие команды и внесите требуемые изменения:

REM Truncate table (for testing)
SQLCMD -Q "TRUNCATE TABLE TestDatabase.dbo.myWidechar;"

REM Open data file
Notepad D:\BCP\myWidechar.bcp
REM Copy first record and then paste as new first record.  This additional record is the "dummy" record.
REM Close file.

REM Import data instructing bcp to skip dummy record with the -F 2 switch.
bcp TestDatabase.dbo.myWidechar IN D:\BCP\myWidechar.bcp -f D:\BCP\myWidechar.fmt -T -F 2

REM Review results is SSMS

REM Return data file to original state for usage in other examples
bcp TestDatabase.dbo.myWidechar OUT D:\BCP\myWidechar.bcp -T -w

Использование инструкции BULK INSERT и символьного формата Юникода без файла форматирования

АргументDATAFILETYPE . Выполните следующий запрос Transact-SQL в Microsoft SQL Server Management Studio (SSMS):

TRUNCATE TABLE TestDatabase.dbo.myWidechar; -- for testing
BULK INSERT TestDatabase.dbo.myWidechar
	FROM 'D:\BCP\myWidechar.bcp'
	WITH (
		DATAFILETYPE = 'widechar'
		);

-- review results
SELECT * FROM TestDatabase.dbo.myWidechar;

Использование инструкции BULK INSERT и символьного формата Юникода с файлом форматирования, не являющимся XML

АргументFORMATFILE . Выполните следующий запрос Transact-SQL в Microsoft SQL Server Management Studio (SSMS):

TRUNCATE TABLE TestDatabase.dbo.myWidechar; -- for testing
BULK INSERT TestDatabase.dbo.myWidechar
   FROM 'D:\BCP\myWidechar.bcp'
   WITH (
		FORMATFILE = 'D:\BCP\myWidechar.fmt'
		);

-- review results
SELECT * FROM TestDatabase.dbo.myWidechar;

Использование инструкции OPENROWSET и символьного формата Юникода с файлом форматирования, не являющимся XML

АргументFORMATFILE . Выполните следующий запрос Transact-SQL в Microsoft SQL Server Management Studio (SSMS):

TRUNCATE TABLE TestDatabase.dbo.myWidechar;  -- for testing
INSERT INTO TestDatabase.dbo.myWidechar
	SELECT *
	FROM OPENROWSET (
		BULK 'D:\BCP\myWidechar.bcp', 
		FORMATFILE = 'D:\BCP\myWidechar.fmt'  
		) AS t1;

-- review results
SELECT * FROM TestDatabase.dbo.myWidechar;

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

См. также:

Программа bcp
BULK INSERT (Transact-SQL)
OPENROWSET (Transact-SQL)
Типы данных (Transact-SQL)
Поддержка параметров сортировки и Юникода