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


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

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

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

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

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

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

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

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

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

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

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

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

BOM может быть неправильно интерпретирован в следующих условиях:

  • Используется служебная программа bcp, а -w переключатель используется для указания символа Юникода

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

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

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

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

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

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

Команда Вариант Описание
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 для создания файла формата, отличного от XML, myWidechar.fmtна основе схемы myWidechar. Чтобы использовать команду bcp для создания файла форматирования, укажите аргумент format и используйте nul вместо пути к файлу данных. Для параметра форматирования также требуется параметр -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 переключатели и команда IN. Необходимо использовать обходное решение, поскольку в этом примере задействованы 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;

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