Udostępnij za pomocą


Importowanie lub eksportowanie danych (SQL Server) przy użyciu formatu znaków Unicode

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)

Format znaków Unicode jest zalecany do zbiorczego transferu danych między wieloma wystąpieniami programu SQL Server przy użyciu pliku danych zawierającego znaki rozszerzone/DBCS. Format danych znaków Unicode umożliwia eksportowanie danych z serwera przy użyciu strony kodowej, która różni się od strony kodowej używanej przez klienta wykonującego operację. W takich przypadkach użycie formatu znaków Unicode ma następujące zalety:

  • Jeśli dane źródłowe i docelowe są typami danych Unicode, użycie formatu znaków Unicode zachowuje wszystkie dane znaków.

  • Jeśli dane źródłowe i docelowe nie są typami danych Unicode, użycie formatu znaków Unicode minimalizuje utratę znaków rozszerzonych w danych źródłowych, których nie można przedstawić w miejscu docelowym.

Zagadnienia dotyczące korzystania z formatu znaków Unicode

W przypadku korzystania z formatu znaków Unicode należy wziąć pod uwagę następujące kwestie:

Specjalne zagadnienia dotyczące używania formatu znaków Unicode, narzędzia bcp i pliku formatu

Pliki danych formatu znaków Unicode są zgodne z konwencjami dotyczącymi plików Unicode. Pierwsze dwa bajty pliku to liczby szesnastkowe, 0xFFFE. Te bajty służą jako znaczniki kolejności bajtów (BOM), określając, czy bajt o wysokiej kolejności jest przechowywany jako pierwszy, czy ostatni w pliku. Narzędzie bcp może błędnie interpretować model BOM i spowodować niepowodzenie części procesu importowania; Może zostać wyświetlony komunikat o błędzie podobny do następującego:

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

Model BOM może zostać błędnie zinterpretowany w następujących warunkach:

  • Narzędzie bcp jest używane, a -w przełącznik służy do wskazywania znaku Unicode

  • Używany jest plik formatu

  • Pierwsze pole w pliku danych nie jest znakiem

Zastanów się, czy którekolwiek z następujących obejść może być dostępne w określonej sytuacji:

Opcje poleceń dla formatu znaków Unicode

Dane formatu znaków Unicode można zaimportować do tabeli przy użyciu narzędzia bcp, BULK INSERT lub OPENROWSET. W przypadku polecenia bcp lub instrukcji BULK INSERT można określić format danych w instrukcji . W przypadku instrukcji OPENROWSET należy określić format danych w pliku formatu.

Format znaków Unicode jest obsługiwany przez następujące opcje polecenia:

Polecenie Opcja Opis
bcp -w Używa formatu znaków Unicode.
BULK INSERT DATAFILETYPE ='widechar' Używa formatu znaków Unicode podczas zbiorczego importowania danych.
OPENROWSET N/A Musi używać pliku formatu

Notatka

Alternatywnie można określić formatowanie dla poszczególnych pól w pliku formatu. Aby uzyskać więcej informacji, zobacz formatowanie plików do importowania lub eksportowania danych (SQL Server).

Przykładowe warunki testu

Przykłady w tym artykule są oparte na poniższej tabeli i pliku formatu.

Przykładowa tabela

Poniższy skrypt tworzy testową bazę danych, tabelę o nazwie myWidechar i wypełnia tabelę kilkoma początkowymi wartościami. Wykonaj następujący skrypt Transact-SQL w 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;

Przykładowy plik formatu innego niż XML

Program SQL Server obsługuje dwa typy plików formatu: format inny niż XML i format XML. Format inny niż XML jest oryginalnym formatem obsługiwanym przez wcześniejsze wersje programu SQL Server. Aby uzyskać więcej informacji, zobacz Użyj plików w formacie innym niż XML (SQL Server).

Następujące polecenie używa narzędzia bcp do generowania pliku formatu innego niż XML, myWidechar.fmt, na podstawie schematu myWidechar. Aby użyć polecenia bcp w celu utworzenia pliku formatu, określ argument format i użyj nul zamiast ścieżki pliku danych. Opcja formatowania wymaga również opcji -f. Ponadto w tym przykładzie kwalifikator c służy do określania danych znaków, a T służy do określania zaufanego połączenia przy użyciu zintegrowanych zabezpieczeń. W wierszu polecenia wprowadź następujące polecenia:

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

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

Ważny

Upewnij się, że plik w formacie innym niż XML kończy się znakami powrotu karetki i nowej linii. W przeciwnym razie może zostać wyświetlony następujący komunikat o błędzie:

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

Przykłady

W poniższych przykładach użyto bazy danych i sformatowaliśmy wcześniej utworzone pliki.

Eksportowanie danych przy użyciu formatu znaków bcp i Unicode

-w przełącznik i polecenie OUT. Plik danych utworzony w tym przykładzie jest używany we wszystkich kolejnych przykładach. W wierszu polecenia wprowadź następujące polecenia:

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

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

Używanie formatu znaków bcp i Unicode do importowania danych bez pliku formatu

-w przełącznik i polecenie IN. W wierszu polecenia wprowadź następujące polecenia:

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

Używanie formatu znaków bcp i Unicode do importowania danych z plikiem formatu innego niż XML

Przełączniki -w i -f oraz polecenie IN. Potrzeba zastosować obejście, ponieważ ten przykład obejmuje bcp, plik formatu, znak Unicode, a pierwsze pole w pliku danych jest typu nie-znakowego. Zobacz Specjalne zagadnienia dotyczące używania formatu znaków Unicode, narzędzia bcp i pliku formatu we wcześniejszej wersji artykułu. Plik danych myWidechar.bcp jest zmieniany przez dodanie dodatkowego rekordu 'fikcyjnego', który następnie jest pomijany za pomocą przełącznika -F 2.

W wierszu polecenia wprowadź następujące polecenia i wykonaj kroki modyfikacji:

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

Użyj BULK INSERT oraz formatu znaków Unicode bez pliku formatu

DATAFILETYPE argument. Wykonaj następujący skrypt Transact-SQL w 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;

Używanie formatu ZNAKÓW BULK INSERT i Unicode z plikiem formatu innego niż XML

FORMATFILE argument. Wykonaj następujący skrypt Transact-SQL w 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;

Używanie formatu znaków OPENROWSET i Unicode z plikiem formatu innego niż XML

FORMATFILE argument. Wykonaj następujący skrypt Transact-SQL w 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;

Aby używać formatów danych do importowania zbiorczego lub eksportu zbiorczego