Condividi tramite


Usare il formato carattere Unicode per importare o esportare dati (SQL Server)

Si applica a:SQL ServerDatabase SQL di AzureIstanza gestita di SQL di AzureAzure Synapse AnalyticsAnalytics Platform System (PDW)

È consigliabile usare il formato carattere Unicode per il trasferimento bulk di dati tra più istanze di SQL Server tramite un file di dati contenente caratteri estesi o DBCS. Il formato di dati carattere Unicode consente l'esportazione dei dati da un server tramite una tabella codici diversa dalla tabella codici utilizzata dal client che esegue l'operazione. In questi casi, l'utilizzo del formato di dati carattere Unicode offre i vantaggi seguenti:

  • Se i dati di origine e di destinazione sono di tipo Unicode, il formato carattere Unicode consente di mantenere tutti i dati di tipo carattere.

  • Se i dati di origine e di destinazione non sono tipi di dati Unicode, l'uso del formato carattere Unicode riduce al minimo la perdita di caratteri estesi nei dati di origine che non possono essere rappresentati nella destinazione.

Considerazioni sull'uso del formato carattere Unicode

Quando si usa il formato carattere Unicode, prendere in considerazione:

  • Per impostazione predefinita, quando si esegue l'utilità bcp, i campi dei dati di tipo carattere vengono separati da un carattere di tabulazione e i record terminano con un carattere di nuova riga. Per informazioni su come specificare caratteri di terminazione alternativi, vedere Specificare caratteri di terminazione dei campi e delle righe (SQL Server).For information about how to specify alternative terminator, see Specify field and row terminator (SQL Server).

  • I dati sql_variant archiviati in un file di dati in formato carattere Unicode funzionano così come in un file in formato carattere, con la differenza che vengono archiviati come dati nchar anziché char . Per altre informazioni sul formato carattere, vedere Regole di confronto e supporto Unicode.

Considerazioni speciali sull'uso del formato carattere Unicode, bcp e di un file di formato

Per i file in formato carattere Unicode vengono rispettate le convenzioni dei file Unicode. I primi due byte del file sono rappresentati da numeri esadecimali, 0xFFFE. Tali byte hanno la funzione di indicatori per l'ordine dei byte (BOM) e specificano se archiviare il byte più significativo come primo o ultimo byte del file. L'utilità bcp potrebbe interpretare in modo errato il BOM e causare il fallimento del processo di importazione; potrebbe essere visualizzato un messaggio di errore simile al seguente:

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

La distinta base potrebbe essere interpretata in modo non corretto nelle condizioni seguenti:

  • L'utilità bcp viene usata e il -w parametro viene utilizzato per indicare il carattere Unicode.

  • Viene usato un file di formato

  • Il primo campo nel file di dati è di tipo non carattere

Valutare se una delle soluzioni alternative seguenti potrebbe essere disponibile per la situazione specifica :

Opzioni di comando per il formato carattere Unicode

È possibile importare dati in formato carattere Unicode in una tabella usando bcp, BULK INSERT o OPENROWSET. Per un comando bcp o un'istruzione BULK INSERT , è possibile specificare il formato di dati nell'istruzione . Per un'istruzione OPENROWSET , è necessario specificare il formato dei dati in un file di formato.

Il formato carattere Unicode è supportato dalle opzioni di comando seguenti:

Comando Opzione Descrizione
bcp -w Utilizza il formato carattere Unicode.
BULK INSERT DATAFILETYPE ='widechar' Utilizza il formato carattere Unicode durante l'importazione bulk di dati.
OPENROWSET N/D Deve usare un file di formato

Nota

In alternativa, è possibile definire la formattazione di ogni singolo campo in un file di formato. Per altre informazioni, vedere Formattare i file per importare o esportare dati (SQL Server).For more information, see format files to import or export data (SQL Server).

Condizioni di test di esempio

Gli esempi in questo articolo sono basati sulla tabella e sul file di formato seguenti.

Tabella di esempio

Lo script seguente crea un database di test, una tabella denominata myWidechar e popola la tabella con alcuni valori iniziali. Eseguire l'istruzione Transact-SQL seguente in 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;

File di formato non XML di esempio

SQL Server supporta due tipi di file di formato, ovvero non XML e XML. Il formato non XML è il formato originale supportato dalle versioni precedenti di SQL Server. Per altre informazioni, vedere Utilizzare file di formato non XML (SQL Server).

Il comando seguente usa l'utilità bcp per generare un file di formato non XML, myWidechar.fmt, in base allo schema di myWidechar. Per usare un comando bcp per creare un file di formato, specificare l'argomento format e usare nul anziché un percorso del file di dati. L'opzione di formattazione richiede anche l'opzione -f. Inoltre, per questo esempio, il qualificatore c viene usato per specificare i dati di caratteri e T viene usato per specificare una connessione attendibile usando la sicurezza integrata. Al prompt dei comandi immettere i comandi seguenti:

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

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

Importante

Assicurati che il file di formato non XML termini con un ritorno carrello/avanzamento riga. In caso contrario, potrebbe essere visualizzato il messaggio di errore seguente:

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

Esempi

Negli esempi seguenti vengono usati il database e i file di formato creati in precedenza.

Usare bcp e il formato carattere Unicode per esportare i dati

-w interruttore e OUT comando. Il file di dati creato in questo esempio viene usato in tutti gli esempi successivi. Al prompt dei comandi immettere i comandi seguenti:

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

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

Usare bcp e il formato carattere Unicode per importare dati senza un file di formato

-w interruttore e IN comando. Al prompt dei comandi immettere i comandi seguenti:

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

Usare bcp e il formato carattere Unicode per importare dati con un file di formato non XML

-w e -f interruttori e comando IN. È necessario usare una soluzione alternativa perché questo esempio prevede bcp, un file di formato, un carattere Unicode e il primo campo dati nel file di dati non è carattere. Vedere Considerazioni speciali per l'uso del formato carattere Unicode, bcp e un file di formato precedentemente nell'articolo. Il file myWidechar.bcp di dati viene modificato aggiungendo un record aggiuntivo come record fittizio, che viene quindi ignorato con l'opzione -F 2 .

Al prompt dei comandi, immettere i comandi seguenti e seguire i passaggi di modifica:

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

Usare BULK INSERT e il formato carattere Unicode senza un file di formato

DATAFILETYPE discussione. Eseguire l'istruzione Transact-SQL seguente in 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;

Usare BULK INSERT e il formato carattere Unicode con un file di formato non XML

FORMATFILE discussione. Eseguire l'istruzione Transact-SQL seguente in 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;

Usare OPENROWSET e il formato carattere Unicode con un file di formato non XML

FORMATFILE discussione. Eseguire l'istruzione Transact-SQL seguente in 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;

Per utilizzare formati di dati per importazione o esportazione massiva