Использование символьного формата Юникода для импорта и экспорта данных (SQL Server)
Применимо: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure azure Synapse Analytics Analytics Platform System (PDW)
Формат символов Юникода рекомендуется для массовой передачи данных между несколькими экземплярами SQL Server с помощью файла данных, содержащего расширенные или dbCS символы. Формат символьных данных Юникода позволяет экспортировать данные из сервера в кодовой странице, отличающейся от кодовой страницы, используемой выполняющим операцию клиентом. В этих случаях использование символьного формата Юникода имеет следующие преимущества.
Если данные источника и назначения имеют тип данных Юникода, при использовании символьного формата Юникода все символьные данные сохраняются.
Если данные источника и назначения имеют тип данных, отличный от Юникода, использование символьного формата Юникода позволяет свести к минимуму потери дополнительных символов данных из источника, которые не могут быть представлены в назначении.
Рекомендации по использованию символьного формата Юникода
При использовании символьного формата Юникода имейте в виду следующее.
По умолчанию программа 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 и символьного формата Юникода для импорта данных без файла форматирования.
Используйте параметр -c вместо -w.
Повторно экспортируйте данные, используя собственный формат.
Используйте инструкцию BULK INSERT или OPENROWSET. Примеры этого обходного пути представлены ниже: ознакомьтесь с разделами Использование BULK INSERT и символьного формата Юникода с файлом форматирования, не являющимся XML и Использование OPENROWSET и символьного формата Юникода с файлом форматирования, не являющимся XML.
Вручную вставьте первую запись в целевой таблице, а затем используйте параметр -F 2 , чтобы начать импорт со второй записи.
Вручную вставьте первую фиктивную запись в файл данных, а затем используйте параметр -F 2 , чтобы начать импорт со второй записи. Пример этого обходного пути представлен ниже: ознакомьтесь с разделом Использование bcp и символьного формата Юникода для импорта данных с файлом форматирования, не являющимся XML.
Используйте промежуточную таблицу, в которой первый столбец имеет символьный тип данных, или
повторно экспортируйте данные и измените порядок полей данных так, чтобы первое поле данных содержало символы. После этого используйте файл форматирования для повторного сопоставления поля данных с фактическим порядком в таблице. Например, ознакомьтесь с разделом Использование файла форматирования для сопоставления столбцов таблицы с полями файла данных (SQL Server).
Параметры команд для символьного формата Юникода
Данные формата символов Юникода можно импортировать в таблицу с помощью bcp, BULK INSERT или INSERT ... SELECT * FROM OPENROWSET(BULK...). Для команды bcp или инструкции BULK INSERT можно указать формат данных в инструкции. Для инструкции INSERT ... SELECT * FROM OPENROWSET(BULK...) нужно указать формат данных в файле форматирования.
Символьный формат Юникода поддерживается следующими параметрами командной строки:
Команда | Вариант | Описание |
---|---|---|
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;
Связанные задачи
Использование форматов данных для массового импорта или экспорта
Импорт данных в собственном и символьном формате из предыдущих версий SQL Server
Использование символьного формата для импорта или экспорта данных (SQL Server)
Использование собственного формата для импорта или экспорта данных (SQL Server)
Использование собственного формата Юникода для импорта или экспорта данных (SQL Server)
См. также
bcp Utility
BULK INSERT (Transact-SQL)
OPENROWSET (Transact-SQL)
Типы данных (Transact-SQL)
Поддержка параметров сортировки и Юникода