Dela via


Använda Unicode-teckenformat för att importera eller exportera data (SQL Server)

gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)

Unicode-teckenformat rekommenderas för massöverföring av data mellan flera instanser av SQL Server med hjälp av en datafil som innehåller utökade/DBCS-tecken. Unicode-teckendataformatet tillåter att data exporteras från en server med hjälp av en kodsida som skiljer sig från den kodsida som används av klienten som utför åtgärden. I sådana fall har användningen av Unicode-teckenformat följande fördelar:

  • Om käll- och måldata är Unicode-datatyper bevarar användningen av Unicode-teckenformatet alla teckendata.

  • Om käll- och måldata inte är Unicode-datatyper minimerar användningen av Unicode-teckenformat förlusten av utökade tecken i källdata som inte kan representeras på målet.

Överväganden för att använda Unicode-teckenformat

När du använder Unicode-teckenformat bör du tänka på:

Särskilda överväganden för att använda Unicode-teckenformat, bcp och en formatfil

Unicode-teckenformatdatafiler följer konventionerna för Unicode-filer. De första två byteen i filen är hexadecimala tal, 0xFFFE. Dessa byte fungerar som byteordningsmärken (BOM) och anger om byte med hög ordning lagras först eller sist i filen. Bcp-verktyget kan misstolka strukturlistan och orsaka att en del av importprocessen misslyckas. du kan få ett felmeddelande som liknar följande:

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

BOM kan misstolkas under följande villkor:

  • Bcp-verktyget används och växeln -w används för att ange Unicode-tecken

  • En formatfil används

  • Det första fältet i datafilen är inte tecken

Överväg om någon av följande lösningar kan vara tillgängliga för din specifika situation:

Kommandoalternativ för Unicode-teckenformat

Du kan importera Unicode-teckenformatdata till en tabell med bcp, BULK INSERT eller OPENROWSET. För ett bcp-kommando eller EN BULK INSERT-instruktion kan du ange dataformatet i -instruktionen. För en OPENROWSET-instruktion måste du ange dataformatet i en formatfil.

Unicode-teckenformat stöds av följande kommandoalternativ:

Befallning Alternativ Beskrivning
bcp -w Använder Unicode-teckenformatet.
BULK INSERT DATAFILETYPE ='widechar' Använder Unicode-teckenformat vid massimport av data.
OPENROWSET Inte tillgänglig Måste använda en formatfil

Anmärkning

Du kan också ange formatering per fält i en formatfil. Mer information finns i formatera filer för att importera eller exportera data (SQL Server).

Exempel på testvillkor

Exemplen i den här artikeln baseras på följande tabell- och formatfil.

Exempeltabell

Följande skript skapar en testdatabas, en tabell med namnet myWidechar och fyller tabellen med några inledande värden. Kör följande Transact-SQL i 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;

Exempelfil med icke-XML-format

SQL Server stöder två typer av formatfiler: icke-XML-format och XML-format. Icke-XML-format är det ursprungliga format som stöds av tidigare versioner av SQL Server. Mer information finns i Använda filer som inte är XML-format (SQL Server).

Följande kommando använder verktyget bcp för att generera en fil som inte är XML-format, myWidechar.fmt, baserat på schemat för myWidechar. Om du vill använda kommandot bcp för att skapa en formatfil anger du argumentet format och använder nul i stället för en datafilsökväg. Formatalternativet kräver också alternativet -f. I det här exemplet används dessutom c för att ange teckendata och T används för att ange en betrodd anslutning med integrerad säkerhet. I en kommandotolk anger du följande kommandon:

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

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

Viktigt!

Se till att filen i annat format än XML slutar med vagnretur och radmatning. Annars kan du få följande felmeddelande:

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

Exempel

Följande exempel använder databasen och formaterar filer som skapats tidigare.

Använd bcp- och Unicode-teckenformat för att exportera data

-w omkopplare och OUT kommando. Datafilen som skapas i det här exemplet används i alla efterföljande exempel. I en kommandotolk anger du följande kommandon:

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

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

Använd bcp- och Unicode-teckenformat för att importera data utan en formatfil

-w omkopplare och IN kommando. I en kommandotolk anger du följande kommandon:

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

Använd bcp- och Unicode-teckenformat för att importera data med en fil som inte är XML-format

-w- och -f-växlar och IN-kommandot. En lösning måste användas eftersom det här exemplet omfattar bcp, en formatfil, Unicode-tecken och det första datafältet i datafilen är icke-tecken. Se Särskilda överväganden för att använda Unicode-teckenformat, bcp och en formatfil tidigare i artikeln. Datafilen myWidechar.bcp ändras genom att lägga till en extra post som en "dummy"-post, vilken sedan hoppas över med omkopplaren -F 2.

I en kommandotolk anger du följande kommandon och följer ändringsstegen:

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

Använd BULK INSERT- och Unicode-teckenformat utan formatfil

DATAFILETYPE argument. Kör följande Transact-SQL i 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;

Använd BULK INSERT- och Unicode-teckenformat med en fil som inte är XML-format

FORMATFILE argument. Kör följande Transact-SQL i 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;

Använda OPENROWSET- och Unicode-teckenformat med en fil som inte är XML-format

FORMATFILE argument. Kör följande Transact-SQL i 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;

Så här använder du dataformat för massimport eller massexport