Condividi tramite


Usare il formato nativo 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)

L'uso del formato nativo è consigliabile per il trasferimento bulk dei dati tra più istanze di SQL Server tramite un file di dati che non contiene caratteri estesi o DBCS (Double Byte Character Set).

Nota

Per il trasferimento bulk di dati tra più istanze di SQL Server mediante un file di dati contenente caratteri estesi o DBCS, è consigliabile usare il formato nativo Unicode. Per altre informazioni, vedere Usare il formato Unicode nativo per importare o esportare dati (SQL Server).

Il formato nativo mantiene i tipi di dati nativi di un database Il formato nativo è progettato per il trasferimento dati ad alta velocità tra le tabelle di SQL Server. Se si utilizza un file di formato, non è necessario che le tabelle di origine e di destinazione siano identiche. Il trasferimento dei dati è costituito da due passaggi:

  1. Esportazione bulk dei dati da una tabella di origine in un file di dati

  2. Importazione bulk dei dati dal file di dati nella tabella di destinazione

L'utilizzo del formato nativo tra tabelle identiche consente di evitare la conversione di tipi di dati nel/dal formato carattere, risparmiando tempo e spazio. Per raggiungere la velocità di trasferimento ottimale, tuttavia, vengono eseguiti solo alcuni controlli relativi alla formattazione dei dati. Per evitare problemi relativi ai dati caricati, vedere l'elenco di restrizioni seguente.

Limitazioni

Per importare correttamente i dati in formato nativo, verificare quanto segue:

  • Il file di dati deve essere in formato nativo.

  • È necessario che la tabella di destinazione sia compatibile con il file di dati (deve includere il numero di colonne, il tipo di dati e la lunghezza corretti, lo stato NULL e così via). In alternativa, è necessario utilizzare un file di formato per eseguire il mapping tra ogni campo e le colonne corrispondenti.

    Nota

    Se si importano i dati da un file non corrispondente alla tabella di destinazione, è possibile che l'operazione di importazione riesca ma i dati della tabella di destinazione potrebbero non essere corretti. Ciò è dovuto al fatto che i dati del file vengono interpretati utilizzando il formato della tabella di destinazione. Pertanto, la mancata corrispondenza causa l'inserimento di valori non corretti Tuttavia, in nessun caso tale discrepanza può determinare inconsistenze di tipo logico o fisico nel database.

    Per informazioni sull'uso dei file di formato, vedere Formattare i file per importare o esportare dati (SQL Server).For information on using format files, see Format files to import or export data (SQL Server).

Un'importazione corretta non danneggerà la tabella di destinazione.

Come bcp gestisce i dati in formato nativo

In questa sezione sono contenute considerazioni particolari sull'importazione e sull'esportazione dei dati in formato nativo mediante l'utilità bcp .

  • Dati non carattere

    L'utilità bcp usa il formato dati binario interno di SQL Server per trasferire dati non di tipo carattere da una tabella in un file di dati.

  • Datichar o varchar

    All'inizio di ogni campo char o varchar , l'utilità bcp aggiunge la lunghezza del prefisso.

    Importante

    Per impostazione predefinita, quando si usa la modalità nativa, l'utilità bcp converte i caratteri di SQL Server in caratteri OEM prima di copiarli in un file di dati. L'utilità bcp converte i caratteri di un file di dati in caratteri ANSI prima dell'importazione bulk in una tabella SQL Server. Durante queste conversioni, si possono perdere dati con caratteri estesi. Per i caratteri estesi, è necessario utilizzare il formato nativo Unicode o specificare una tabella codici.

  • Datisql_variant

    Se i dati sql_variant vengono archiviati come SQLVARIANT in un file di dati in formato nativo, verranno mantenute tutte le relative caratteristiche. I metadati che registrano il tipo di dati di ogni valore vengono archiviati insieme al valore stesso. Questi metadati vengono usati per creare di nuovo il valore con lo stesso tipo di dati in una colonna di destinazione sql_variant .

    Se il tipo di dati della colonna di destinazione è diverso da sql_variant, ogni valore viene convertito nel tipo di dati della colonna di destinazione, in base alle regole standard di conversione implicita dei dati. Se si verifica un errore durante la conversione dei dati, viene eseguito il rollback del batch corrente. Eventuali valori char e varchar trasferiti tra le colonne sql_variant potrebbero presentare problemi di conversione della pagina codice.

    Per altre informazioni sulla conversione dei dati, vedere Conversione dei tipi di dati (motore di database).

Opzioni di comando per il formato nativo

È possibile importare i dati in formato nativo in una tabella usando bcp, BULK INSERT o INSERT ... SELECT * FROM OPENROWSET(BULK...). Per un comando bcp o un'istruzione BULK INSERT è possibile specificare il formato dati nell'istruzione. Per un'istruzione INSERT ... SELECT * FROM OPENROWSET(BULK...) è necessario specificare il formato dati in un file di formato.

Il formato nativo è supportato dalle opzioni di comando seguenti:

Comando Opzione Descrizione
bcp -n Fa sì che l'utilità bcp utilizzi i tipi di dati nativi dei dati.*
BULK INSERT DATAFILETYPE ='native' Utilizza i tipi di dati nativi o nativi estesi. DATAFILETYPE non è necessario se un file di formato specifica i tipi di dati.
OPENROWSET N/D Deve usare un file di formato

* Per caricare dati nativi (-n) in un formato compatibile con le versioni precedenti dei client SQL Server, usare l'opzione -V . Per altre informazioni, vedere Importare dati in formato nativo e carattere da versioni precedenti di SQL Server.

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 ed esportare i dati (SQL Server).

Condizioni di test di esempio

Negli esempi vengono usati i file di database e di formato creati in questo articolo.

Tabella di esempio

Lo script seguente crea un database di test, una tabella denominata myNative 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.myNative ( 
   PersonID smallint NOT NULL,
   FirstName varchar(25) NOT NULL,
   LastName varchar(30) NOT NULL,
   BirthDate date,
   AnnualSalary money
   );

-- Populate table
INSERT TestDatabase.dbo.myNative
VALUES 
(1, 'Anthony', 'Grosse', '1980-02-23', 65000.00),
(2, 'Alica', 'Fatnowna', '1963-11-14', 45000.00),
(3, 'Stella', 'Rossenhain', '1992-03-02', 120000.00);

-- Review Data
SELECT * FROM TestDatabase.dbo.myNative;

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 informazioni dettagliate, vedere Usare file di formato non XML (SQL Server ). Il comando seguente userà l' utility bcp per generare un formato di file non XML, myNative.fmt, sulla base dello schema di myNative. 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.myNative format nul -f D:\BCP\myNative.fmt -T 

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

Importante

Verificare che il file di formato non XML termini con un ritorno a capo/avanzamento riga. In caso contrario, è possibile che venga 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 vengono usati i file di database e di formato creati in questo articolo.

Usare bcp e il formato nativo per esportare i dati

Opzione -n e comando OUT.

Il file di dati creato in questo esempio verrà usato negli esempi successivi.

Al prompt dei comandi immettere i comandi seguenti:

bcp TestDatabase.dbo.myNative OUT D:\BCP\myNative.bcp -T -n

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

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

Opzione -n e comando IN.

Al prompt dei comandi immettere i comandi seguenti:

REM Truncate table (for testing)
SQLCMD -Q "TRUNCATE TABLE TestDatabase.dbo.myNative;"

REM Import data
bcp TestDatabase.dbo.myNative IN D:\BCP\myNative.bcp -T -n

REM Review results
SQLCMD -Q "SELECT * FROM TestDatabase.dbo.myNative;"

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

Gli interruttori -n e -f e il comando IN.

Al prompt dei comandi immettere i comandi seguenti:

REM Truncate table (for testing)
SQLCMD -Q "TRUNCATE TABLE TestDatabase.dbo.myNative;"

REM Import data
bcp TestDatabase.dbo.myNative IN D:\BCP\myNative.bcp -f D:\BCP\myNative.fmt -T

REM Review results
SQLCMD -Q "SELECT * FROM TestDatabase.dbo.myNative;"

Usare BULK INSERT e il formato nativo senza un file di formato

Argomento DATAFILETYPE.

Eseguire l'istruzione Transact-SQL seguente in Microsoft SQL Server Management Studio (SSMS):

TRUNCATE TABLE TestDatabase.dbo.myNative; -- for testing
BULK INSERT TestDatabase.dbo.myNative
    FROM 'D:\BCP\myNative.bcp'
    WITH (
        DATAFILETYPE = 'native'
        );

-- review results
SELECT * FROM TestDatabase.dbo.myNative;

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

Argomento FORMATFILE.

Eseguire l'istruzione Transact-SQL seguente in Microsoft SQL Server Management Studio (SSMS):

TRUNCATE TABLE TestDatabase.dbo.myNative; -- for testing
BULK INSERT TestDatabase.dbo.myNative
   FROM 'D:\BCP\myNative.bcp'
   WITH (
        FORMATFILE = 'D:\BCP\myNative.fmt'
        );

-- review results
SELECT * FROM TestDatabase.dbo.myNative;

Usare OPENROWSET e il formato nativo con un file di formato non XML

Argomento FORMATFILE.

Eseguire l'istruzione Transact-SQL seguente in Microsoft SQL Server Management Studio (SSMS):

TRUNCATE TABLE TestDatabase.dbo.myNative;  -- for testing
INSERT INTO TestDatabase.dbo.myNative
    SELECT *
    FROM OPENROWSET (
        BULK 'D:\BCP\myNative.bcp', 
        FORMATFILE = 'D:\BCP\myNative.fmt'  
        ) AS t1;

-- review results
SELECT * FROM TestDatabase.dbo.myNative;

Per utilizzare i formati dati per l'importazione o l'esportazione in blocco: