共用方式為


大量匯入期間保留 Null 或使用預設值 (SQL Server)

根據預設,當資料匯入資料表時, bcp 命令和 BULK INSERT 陳述式會查看資料表中的資料行是否已定義預設值。 例如,若資料檔中有一個 Null 值欄位,將會以載入該資料行的預設值來取代。 bcp 命令和 BULK INSERT 陳述式都可讓您指定保留 Null 值。

相對地,一般的 INSERT 陳述式會保留 Null 值,而不會插入預設值。 INSERT ...SELECT * FROM OPENROWSET(BULK...) 陳述式所提供的基本行為與一般 INSERT 陳述式相同,但它還支援用於插入預設值的資料表提示。

注意

如需略過資料表資料行的範例格式檔案,請參閱使用格式檔案略過資料表資料行 (SQL Server)

範例資料表與資料檔

若要執行此主題中的範例,您必須建立範例資料表與資料檔。

範例資料表

在此範例中,必須將名為 MyTestDefaultCol2 的資料表,建立在 AdventureWorks 範例資料庫中的 dbo 結構描述下。 若要建立此資料表,請在 Microsoft SQL Server Management Studio 查詢編輯器 中執行:

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

請注意,第二個資料表資料行 Col2 中有預設值。

範例格式檔案

有些大量匯入範例會使用非 XML 格式檔案 MyTestDefaultCol2-f-c.Fmt,此檔案與 MyTestDefaultCol2 資料表完全對應。 若要建立此格式檔案,請在 Microsoft Windows 命令提示字元中輸入:

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

如需建立格式檔案的詳細資訊,請參閱建立格式檔案 (SQL Server) (部分機器翻譯)。

範例資料檔

此範例將使用範例資料檔 MyTestEmptyField2-c.Dat,此檔案在第二個欄位中不含任何值。 MyTestEmptyField2-c.Dat 資料檔含有下列記錄。

1,,DataField3  
2,,DataField3  
  

使用 bcp 或 BULK INSERT 保留 Null 值

下列限定詞 (qualifier) 可指定資料檔中的空白欄位,在大量匯入作業期間保留其 Null 值,而不要繼承資料表資料行的預設值 (若有的話)。

Command Qualifier 限定詞類型
bcp -k Switch
BULK INSERT KEEPNullS1 引數

1 針對 BULK INSERT,如果預設值無法使用,則必須定義資料表資料行以允許 Null 值。

注意

這些限定詞會使這些大量匯入命令不再檢查資料表上有無 DEFAULT 定義, 但對任何並行 INSERT 陳述式而言,DEFAULT 定義是可預期的。

如需詳細資訊,請參閱 bcp 公用程式和BULK INSERT (Transact-SQL)

範例

本節中的範例使用 bcp 或 BULK INSERT 進行大量匯入,並保留 Null 值。

第二個資料表資料行 Col2 有預設值。 資料檔的對應欄位包含空白字串。 依預設,若使用 bcp 或 BULK INSERT 將資料由此資料檔匯入 MyTestDefaultCol2 資料表中,則會插入預設值 Col2,進而產生下列結果:

1 Default value of Col2 DataField3
2 Default value of Col2 DataField3

若要插入 「 NULL 」 而非 「 Default value of Col2 」,您必須使用 -k switch 或 KEEPNull 選項,如下列 bcp 和 BULK INSERT 範例所示。

使用 bcp 並保留 Null 值

下列範例示範如何使用 bcp 命令保留 Null 值。 bcp命令包含下列參數:

Switch 描述
-f 指定命令將使用格式檔案。
-k 指定空白資料行在作業過程中應保持 Null 值,而非保有插入之資料行的任何預設值。
-T 指定 bcp 公用程式會使用受信任的連線連接到SQL Server。

在 Windows 命令提示字元中,輸入:

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

使用 BULK INSERT 並保留 Null 值

以下範例將示範如何在 BULK INSERT 陳述式中使用 KEEPNULLS 選項。 從查詢工具,例如SQL Server Management Studio 查詢編輯器,執行:

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

使用 INSERT 保留預設值 ...SELECT * FROM OPENROWSET (BULK...)

根據預設,在大量載入作業中未指定的任何資料行,會透過 INSERT ... 設定為 NullSELECT * FROM OPENROWSET (BULK...) 。不過,您可以針對資料檔案中的空白欄位指定 ,如果有任何) ,對應的資料表資料行就會使用其預設值 (。 若要使用預設值,請指定下列資料表提示:

Command Qualifier 限定詞類型
INSERT ...SELECT * FROM OPENROWSET(BULK...) WITH(KEEPDEFAULTS) 資料表提示

範例

下列 INSERT ...SELECT * FROM OPENROWSET (BULK...) 範例大量匯入資料,並保留預設值。

若要執行範例,您必須建立 MyTestDefaultCol2 範例資料表與 MyTestEmptyField2-c.Dat 資料檔,並使用格式檔案 MyTestDefaultCol2-f-c.Fmt。 如需建立這些範例的詳細資訊,請參閱本主題稍早的「範例資料表與資料檔」。

第二個資料表資料行 Col2 有預設值。 資料檔的對應欄位包含空白字串。 當 INSERT ...SELECT * FROM OPENROWSET (BULK...) 將此資料檔案的欄位匯入 MyTestDefaultCol2 資料表,根據預設,Null 會插入 Col2 ,而不是預設值。 此預設行為會產生下列結果:

1 NULL DataField3
2 NULL DataField3

若要插入預設值 "Default value of Col2" 而非 "NULL",您必須使用 KEEPDEFAULTS 資料表提示,如下列範例所示。 從查詢工具,例如SQL Server Management Studio 查詢編輯器,執行:

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

相關工作

若要使用格式檔案

若要使用大量匯入或大量匯出的資料格式

若要在使用 bcp 時指定相容性的資料格式

另請參閱

BACKUP (Transact-SQL)
OPENROWSET (Transact-SQL)
bcp 公用程式
BULK INSERT (Transact-SQL)
資料表提示 (Transact-SQL)