データの一括インポート時の ID 値の保持

ID 値を含んでいるデータ ファイルを Microsoft SQL Server のインスタンスに一括インポートできます。既定では、インポートされたデータ ファイルの ID 列の値は無視され、SQL Server によって固有の値が自動的に割り当てられます。固有の値は、テーブル作成時に指定されたシード値と増分値に基づいています。

データ ファイルにテーブルの ID 列の値が含まれていない場合は、フォーマット ファイルを使用してデータをインポートするときにテーブルの ID 列をスキップするように指定します。SQL Server は固有の値をこの列に自動的に割り当てます。

テーブルにデータ行を一括インポートするときに SQL Server が ID 値を割り当てないようにするには、適切な keep-identity コマンド修飾子を使用します。keep-identity 修飾子を指定すると、SQL Server ではデータ ファイルの ID 値を使用します。このような修飾子は次のとおりです。

コマンド

Keep-identity 修飾子

修飾子の種類

bcp

-E

スイッチ

BULK INSERT

KEEPIDENTITY

引数

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

KEEPIDENTITY

テーブル ヒント

詳細については、「bcp ユーティリティ」、「BULK INSERT (Transact-SQL)」、「OPENROWSET (Transact-SQL)」、「INSERT (Transact-SQL)」、「SELECT (Transact-SQL)」、および「テーブル ヒント (Transact-SQL)」を参照してください。

このトピックの例では、INSERT ... SELECT * FROM OPENROWSET(BULK...) を使用し、既定値を保持して、データを一括インポートします。

サンプル テーブル

この一括インポートの例では、dbo スキーマに基づいて、myTestKeepNulls という名前のテーブルを AdventureWorks2008R2 サンプル データベースに作成する必要があります。このテーブルを作成するには、SQL Server Management Studio クエリ エディターで次のコードを実行します。

USE AdventureWorks2008R2;
GO
SELECT * INTO HumanResources.myDepartment 
   FROM HumanResources.Department
      WHERE 1=0;
GO
SELECT * FROM HumanResources.myDepartment;

USE AdventureWorks2008R2;
GO
SELECT * INTO HumanResources.myDepartment 
   FROM HumanResources.Department
      WHERE 1=0;
GO
SELECT * FROM HumanResources.myDepartment;

myDepartment の基になる Department テーブルには IDENTITY_INSERT があり、OFF に設定されています。したがって、ID 列にデータをインポートするには、KEEPIDENTITY または -E を指定する必要があります。

サンプル データ ファイル

一括インポートの例で使用したデータ ファイルには、ネイティブ形式で HumanResources.Department テーブルから一括エクスポートされたデータが含まれています。このデータ ファイルを作成するには、Microsoft Windows のコマンド プロンプトで次のように入力します。

bcp AdventureWorks2008R2.HumanResources.Department out myDepartment-n.Dat -n -T

bcp AdventureWorks2008R2.HumanResources.Department out myDepartment-n.Dat -n -T

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

この一括インポートの例では myDepartment-f-x-n.Xml という XML フォーマット ファイルを使用します。ここではネイティブのデータ形式が使用されています。この例では、bcp を使用して、AdventureWorks2008R2 データベースの HumanResources.Department テーブルからこのフォーマット ファイルを作成します。Windows のコマンド プロンプトで、次のように入力します。

bcp AdventureWorks2008R2.HumanResources.Department format nul -n -x -f myDepartment-f-n-x.Xml -T

bcp AdventureWorks2008R2.HumanResources.Department format nul -n -x -f myDepartment-f-n-x.Xml -T

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

A. bcp を使用して ID 値を保持する方法

次の例では、bcp を使用してデータを一括インポートするときに ID 値を保持する方法について説明します。bcp コマンドは、フォーマット ファイル myDepartment-f-n-x.Xml を使用し、次のスイッチを含んでいます。

修飾子

説明

-E

データ ファイルの ID 値を ID 列に使用するように指定します。

-T

信頼関係接続で、bcp ユーティリティを SQL Server に接続するように指定します。

Windows のコマンド プロンプトで、次のように入力します。

bcp AdventureWorks2008R2.HumanResources.myDepartment in C:\myDepartment-n.Dat -f C:\myDepartment-f-n-x.Xml -E -T

bcp AdventureWorks2008R2.HumanResources.myDepartment in C:\myDepartment-n.Dat -f C:\myDepartment-f-n-x.Xml -E -T

B. BULK INSERT を使用して ID 値を保持する方法

次の例では、BULK INSERT を使用して、myDepartment-c.Dat ファイルから AdventureWorks2008R2.HumanResources.myDepartment テーブルにデータを一括インポートします。このステートメントは、myDepartment-f-n-x.Xml フォーマット ファイルを使用し、データ ファイル内の任意の ID 値が必ず保持されるように KEEPIDENTITY オプションを含んでいます。

SQL Server Management Studio クエリ エディターで、次のように実行します。

USE AdventureWorks2008R2;
GO
DELETE HumanResources.myDepartment;
GO
BULK INSERT HumanResources.myDepartment
   FROM 'C:\myDepartment-n.Dat'
   WITH (
      KEEPIDENTITY,
      FORMATFILE='C:\myDepartment-f-n-x.Xml'
   );
GO
SELECT * FROM HumanResources.myDepartment;

USE AdventureWorks2008R2;
GO
DELETE HumanResources.myDepartment;
GO
BULK INSERT HumanResources.myDepartment
   FROM 'C:\myDepartment-n.Dat'
   WITH (
      KEEPIDENTITY,
      FORMATFILE='C:\myDepartment-f-n-x.Xml'
   );
GO
SELECT * FROM HumanResources.myDepartment;

C. OPENROWSET を使用して ID 値を保持する方法

次の例では、OPENROWSET 一括行セット プロバイダーを使用して、myDepartment-c.Dat ファイルから AdventureWorks2008R2.HumanResources.myDepartment テーブルにデータを一括インポートします。このステートメントは、myDepartment-f-n-x.Xml フォーマット ファイルを使用し、データ ファイル内の任意の ID 値が必ず保持されるように KEEPIDENTITY ヒントを含んでいます。

SQL Server Management Studio クエリ エディターで、次のように実行します。

USE AdventureWorks2008R2;
GO
DELETE HumanResources.myDepartment;
GO

INSERT INTO HumanResources.myDepartment
   with (KEEPIDENTITY)
   (DepartmentID, Name, GroupName, ModifiedDate)
   SELECT *
      FROM  OPENROWSET(BULK 'C:\myDepartment-n.Dat',
      FORMATFILE='C:\myDepartment-f-n-x.Xml') as t1;
GO

USE AdventureWorks2008R2;
GO
DELETE HumanResources.myDepartment;
GO

INSERT INTO HumanResources.myDepartment
   with (KEEPIDENTITY)
   (DepartmentID, Name, GroupName, ModifiedDate)
   SELECT *
      FROM  OPENROWSET(BULK 'C:\myDepartment-n.Dat',
      FORMATFILE='C:\myDepartment-f-n-x.Xml') as t1;
GO