Mantenimento dei valori Null o utilizzo dei valori predefiniti durante un'importazione bulk

Per impostazione predefinita, durante l'importazione di dati in una tabella il comando bcp e l'istruzione BULK INSERT osservano gli eventuali valori predefiniti che sono stati definiti per le colonne della tabella. Ad esempio, se un file di dati contiene un campo Null, verrà caricato nel campo il valore predefinito della colonna. Il comando bcp e l'istruzione BULK INSERT consentono entrambi di specificare che dovranno essere mantenuti i valori Null.

Un'istruzione INSERT regolare mantiene invece il valore Null anziché inserire un valore predefinito. L'istruzione INSERT ... SELECT * FROM OPENROWSET(BULK...) funziona in modo analogo a un'istruzione INSERT regolare, ma supporta inoltre un hint di tabella per l'inserimento di valori predefiniti.

Nota

Per informazioni su file di formato di esempio che escludono una colonna di tabella, vedere Utilizzo di un file di formato per ignorare una colonna di una tabella.

Tabella e file di dati di esempio

Per eseguire gli esempi riportati in questo argomento, è necessario creare una tabella e un file di dati di esempio.

Tabella di esempio

Gli esempi richiedono che una tabella denominata MyTestDefaultCol2 venga creata nel database di esempio AdventureWorks2008R2 in base allo schema dbo. Per creare la tabella, nell'editor di query di Microsoft SQL Server Management Studio eseguire:

USE AdventureWorks2008R2;
GO
CREATE TABLE MyTestDefaultCol2 
(Col1 smallint,
Col2 nvarchar(50) DEFAULT 'Default value of Col2',
Col3 nvarchar(50) 
);
GO

Si noti che la seconda colonna della tabella, Col2, ha un valore predefinito.

File di formato di esempio

In alcuni degli esempi di importazione bulk viene utilizzato un file di formato non XML, MyTestDefaultCol2-f-c.Fmt che corrisponde esattamente alla tabella MyTestDefaultCol2. Per creare questo file di formato, al prompt dei comandi di Microsoft Windows digitare:

bcp AdventureWorks2008R2..MyTestDefaultCol2 format nul -c -f C:\MyTestDefaultCol2-f-c.Fmt -t, -r\n -T

Per ulteriori informazioni sulla creazione di file di formato, vedere Creazione di un file di formato.

File di dati di esempio

Nell'esempio viene utilizzato un file di dati di esempio, MyTestEmptyField2-c.Dat, che non contiene alcun valore nel secondo campo. Il file di dati MyTestEmptyField2-c.Dat contiene i record seguenti:

1,,DataField3
2,,DataField3

Mantenimento dei valori Null con bcp o BULK INSERT

I qualificatori seguenti specificano che un campo vuoto del file di dati mantiene il relativo valore Null durante l'importazione bulk anziché ereditare un valore predefinito (se disponibile) per le colonne della tabella.

Comando

Qualificatore

Tipo di qualificatore

bcp

-k

Opzione

BULK INSERT

KEEPNULLS1

Argomento

1 Per BULK INSERT, se i valori predefiniti non sono disponibili, è necessario impostare la colonna della tabella in modo da consentire valori Null.

Nota

Questi qualificatori disabilitano il controllo delle definizioni DEFAULT di una tabella mediante i comandi per l'importazione bulk. Per le istruzioni INSERT simultanee, le definizioni DEFAULT sono tuttavia previste.

Per ulteriori informazioni, vedere Utilità bcp e BULK INSERT (Transact-SQL).

Esempi

Negli esempi riportati in questa sezione viene eseguita l'importazione bulk tramite bcp o BULK INSERT e vengono mantenuti i valori Null.

La seconda colonna della tabella, Col2, ha un valore predefinito. Il campo corrispondente del file di dati contiene una stringa vuota. Per impostazione predefinita, se si utilizza bcp o BULK INSERT per importare i dati di questo file di dati nella tabella MyTestDefaultCol2, viene inserito il valore predefinito di Col2 e viene generato il risultato seguente:

1

Default value of Col2

DataField3

2

Default value of Col2

DataField3

Per inserire "NULL" anziché "Default value of Col2", è necessario utilizzare l'opzione -k o KEEPNULL, come illustrato negli esempi seguenti relativi a bcp e BULK INSERT.

Utilizzo di bcp e mantenimento dei valori Null

Nell'esempio seguente viene illustrato come mantenere i valori Null in un comando bcp. Per il comando bcp sono disponibili le opzioni seguenti:

Opzione

Descrizione

-f

Specifica che il comando utilizza un file di formato.

-k

Specifica che durante l'operazione le colonne vuote devono mantenere un valore Null, ovvero che non verranno inseriti eventuali valori predefiniti nelle colonne vuote.

-T

Specifica che l'utilità bcp si connette a SQL Server con una connessione trusted.

Al prompt dei comandi di Windows digitare:

bcp AdventureWorks2008R2..MyTestDefaultCol2 in C:\MyTestEmptyField2-c.Dat -f C:\MyTestDefaultCol2-f-c.Fmt -k -T

Utilizzo di BULK INSERT e mantenimento dei valori Null

Nell'esempio seguente viene illustrato come utilizzare l'opzione KEEPNULLS in un'istruzione BULK INSERT. Tramite un'utilità per l'immissione di query, ad esempio l'editor di query di SQL Server Management Studio, eseguire:

USE AdventureWorks2008R2;
GO
BULK INSERT MyTestDefaultCol2
   FROM 'C:\MyTestEmptyField2-c.Dat'
   WITH (
      DATAFILETYPE = 'char',
      FIELDTERMINATOR = ',',
      KEEPNULLS
   );
GO

Mantenimento dei valori predefiniti con INSERT ... SELECT * FROM OPENROWSET(BULK...).

Per impostazione predefinita, le colonne che non sono specificate nell'operazione di importazione bulk vengono impostate su NULL da INSERT ... SELECT * FROM OPENROWSET(BULK...). È tuttavia possibile specificare che la colonna della tabella corrispondente a un campo vuoto del file di dati utilizzerà il relativo valore predefinito (se disponibile). Per utilizzare i valori predefiniti, specificare l'hint di tabella seguente:

Comando

Qualificatore

Tipo di qualificatore

INSERT ... SELECT * FROM OPENROWSET(BULK...).

WITH(KEEPDEFAULTS)

Hint di tabella

Esempi

L'esempio seguente relativo a INSERT ... SELECT * FROM OPENROWSET(BULK...) esegue l'importazione bulk di dati e mantiene i valori predefiniti.

Per eseguire gli esempi, è necessario creare la tabella di esempio MyTestDefaultCol2, il file di dati MyTestEmptyField2-c.Dat e utilizzare un file di formato, MyTestDefaultCol2-f-c.Fmt. Per informazioni sulla creazione di questi esempi, vedere la sezione relativa alla tabella e file di dati di esempio più indietro in questo argomento.

La seconda colonna della tabella, Col2, ha un valore predefinito. Il campo corrispondente del file di dati contiene una stringa vuota. Quando l'istruzione INSERT ... SELECT * FROM OPENROWSET(BULK...) importa i campi del file di dati nella tabella MyTestDefaultCol2, in Col2 viene inserito NULL anziché il valore predefinito. Questo comportamento predefinito genera il risultato seguente:

1

NULL

DataField3

2

NULL

DataField3

Per inserire il valore predefinito "Default value of Col2" anziché "NULL", è necessario utilizzare l'hint di tabella KEEPDEFAULTS, come è illustrato nell'esempio seguente. Tramite un'utilità per l'immissione di query, ad esempio l'editor di query di SQL Server Management Studio, eseguire:

USE AdventureWorks2008R2;
GO
INSERT INTO MyTestDefaultCol2
    WITH (KEEPDEFAULTS)
    SELECT *
      FROM OPENROWSET(BULK  'C:\MyTestEmptyField2-c.Dat',
      FORMATFILE='C:\MyTestDefaultCol2-f-c.Fmt'     
      ) as t1 ;
GO