次の方法で共有


一括インポート中の NULL の保持または既定値の使用 (SQL Server)

既定では、データをテーブルにインポートするとき、 bcp コマンドと BULK INSERT ステートメントによって、テーブルの列に対して定義されているすべての既定値が監視されます。 たとえば、データ ファイルに NULL フィールドがある場合は、NULL 値の代わりにその列の既定値が読み込まれます。 bcp コマンドと BULK INSERT ステートメントの両方で、NULL 値を保持することを指定することもできます。

これに対し、通常の INSERT ステートメントでは、既定値が挿入されるのではなく、NULL 値が保持されます。 INSERT ...SELECT * FROM OPENROWSET(BULK...) ステートメントでは、通常の INSERT と同じ基本的な動作に加えて、既定値を挿入するためのテーブル ヒントがサポートされます。

注意

テーブル列をスキップするフォーマット ファイルの例については、「テーブル列をスキップするためのフォーマット ファイルの使用 (SQL Server)」を参照してください。

サンプル テーブルとデータ ファイル

このトピックに記載されている例を実行するには、サンプル テーブルとデータ ファイルを作成する必要があります。

サンプル テーブル

以下の例を実行するには、 dbo スキーマに基づいて、 MyTestDefaultCol2 という名前のテーブルを AdventureWorks サンプル データベース内で作成する必要があります。 このテーブルを作成するには、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  
  

2 番目のテーブル列 Col2には既定値があることに注意してください。

サンプル フォーマット ファイル

一括インポートの一部の例では、MyTestDefaultCol2-f-c.Fmt テーブルに対応している XML 以外のフォーマット ファイル MyTestDefaultCol2 を使用します。 このフォーマット ファイルを作成するには、Microsoft Windows コマンド プロンプトで次のように入力します。

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

フォーマット ファイルの作成方法の詳細については、「フォーマット ファイルの作成 (SQL Server)」を参照してください。

サンプル データ ファイル

この例では、2 番目のフィールドに値を含まないサンプル データ ファイル MyTestEmptyField2-c.Datを使用します。 MyTestEmptyField2-c.Dat データ ファイルには、以下のレコードが含まれています。

1,,DataField3  
2,,DataField3  
  

bcp または BULK INSERT を使用した NULL 値の保持

以下の修飾子は、一括インポート操作中、テーブル列の既定値がある場合にその既定値を継承するのではなく、データ ファイルの空のフィールドにそのフィールドの 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 値を保持します。

2 番目のテーブル列 Col2には、既定値があります。 データ ファイルの対応するフィールドには、空の文字列が含まれています。 既定では、 bcp または BULK INSERT を使用して、このデータ ファイルから MyTestDefaultCol2 テーブルにデータをインポートすると、 Col2 の既定値が挿入され、以下の結果が生成されます。

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

"" の代わりに "NULL" を挿入するには、次の bcp と BULK INSERT の例に示すように、switch または KEEPNULL オプションを使用-kする必要があります。Default value of Col2

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 ..によって NULL に設定されます。SELECT * 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というフォーマット ファイルを使用する必要があります。 これらのサンプルの作成については、このトピックの前半の「サンプル テーブルとデータ ファイル」を参照してください。

2 番目のテーブル列 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  
  

Related Tasks

フォーマット ファイルを作成するには

一括インポートまたは一括エクスポートのデータ形式を使用するには

bcp を使用した互換性のためのデータ形式を指定するには

参照

BACKUP (Transact-SQL)
OPENROWSET (Transact-SQL)
bcp ユーティリティ
BULK INSERT (Transact-SQL)
テーブル ヒント (Transact-SQL)