BULK INSERT (Transact-SQL)
ユーザーが指定した形式で、データベース テーブルまたはビュー内にデータ ファイルをインポートします。
構文
BULK INSERT
[ database_name . [ schema_name ] . | schema_name . ] [ table_name | view_name ]
FROM 'data_file'
[ WITH
(
[ [ , ] BATCHSIZE = batch_size ]
[ [ , ] CHECK_CONSTRAINTS ]
[ [ , ] CODEPAGE = { 'ACP' | 'OEM' | 'RAW' | 'code_page' } ]
[ [ , ] DATAFILETYPE =
{ 'char' | 'native'| 'widechar' | 'widenative' } ]
[ [ , ] FIELDTERMINATOR = 'field_terminator' ]
[ [ , ] FIRSTROW = first_row ]
[ [ , ] FIRE_TRIGGERS ]
[ [ , ] FORMATFILE = 'format_file_path' ]
[ [ , ] KEEPIDENTITY ]
[ [ , ] KEEPNULLS ]
[ [ , ] KILOBYTES_PER_BATCH = kilobytes_per_batch ]
[ [ , ] LASTROW = last_row ]
[ [ , ] MAXERRORS = max_errors ]
[ [ , ] ORDER ( { column [ ASC | DESC ] } [ ,...n ] ) ]
[ [ , ] ROWS_PER_BATCH = rows_per_batch ]
[ [ , ] ROWTERMINATOR = 'row_terminator' ]
[ [ , ] TABLOCK ]
[ [ , ] ERRORFILE = 'file_name' ]
)]
引数
database_name
指定のテーブルまたはビューが含まれているデータベース名を指定します。 指定しない場合、現在のデータベースが使用されます。schema_name
テーブルまたはビューのスキーマの名前を指定します。 一括インポート操作を実行するユーザーの既定のスキーマが、指定したテーブルまたはビューのスキーマと同じ場合、schema_name は省略可能です。 schema を指定せず、さらに一括インポート操作を実行するユーザーの既定のスキーマが、指定したテーブルまたはビューのスキーマと異なる場合、SQL Server ではエラー メッセージが返され、一括インポート操作は取り消されます。table_name
データの一括インポート先のテーブル名またはビュー名を指定します。 指定できるビューは、すべての列が同じベース テーブルを参照するビューだけです。 データをビューに読み込むときの制限の詳細については、「INSERT (Transact-SQL)」を参照してください。' data_file '
指定のテーブルまたはビューにインポートするデータが含まれているデータ ファイルの完全なパスを指定します。 BULK INSERT を使用して、ディスク (ネットワーク、フロッピー ディスク、ハード ディスクなど) からデータをインポートすることができます。data_file には、SQL Server が実行されているサーバーからの有効なパスを指定する必要があります。 data_file がリモート ファイルの場合は、UNC (汎用名前付け規則) 名を指定します。 UNC 名の形式は、\\Systemname\ShareName\Path\FileName です。 たとえば、\\SystemX\DiskZ\Sales\update.txt のように指定します。
BATCHSIZE **=**batch_size
1 つのバッチに含まれている行の数を指定します。 それぞれのバッチは、1 回のトランザクションでサーバーにコピーされます。 コピーに失敗した場合、SQL Server では各バッチのトランザクションがコミットまたはロールバックされます。 既定では、指定のデータ ファイル内にあるすべてのデータが 1 つのバッチになります。パフォーマンスに関する考慮事項については、後の「解説」を参照してください。CHECK_CONSTRAINTS
一括インポート操作中、対象テーブルまたはビューに対するすべての制約を検証します。 CHECK_CONSTRAINTS オプションを指定しない場合、CHECK 制約および FOREIGN KEY 制約は無視され、操作の後でテーブルの制約は信頼されていないものとしてマークされます。注 UNIQUE および PRIMARY KEY 制約は常に適用されます。 NOT NULL 制約で定義された文字型列にインポートする場合、テキスト ファイルに値がなければ BULK INSERT は空白文字列を挿入します。
テーブル全体の制約は、任意の時点で必ず検証してください。 一括インポート操作の実行時にテーブルが空でなかった場合は、制約の再検証を行うと、追加データに CHECK 制約を適用するよりもコストがかかる可能性があります。
入力データに制約違反の行が含まれている場合などは、制約を無効 (既定の動作) にできます。 制約の CHECK を無効にした場合は、データをインポートした後 Transact-SQL ステートメントを使用して無効なデータを削除できます。
注 MAXERRORS オプションは制約チェックには適用されません。
注 SQL Server 2005 以降のバージョンでは、BULK INSERT によって実行される新しいデータ検証とデータ チェックが原因で、データ ファイルのデータが無効な場合にそのデータを使用して既存のスクリプトを実行すると、スクリプトが失敗する可能性があります。
CODEPAGE = { 'ACP' | 'OEM' | 'RAW' | 'code_page' }
データ ファイル内のデータのコード ページを指定します。 CODEPAGE は、127 より大きいか、32 より小さい文字値の char、varchar、または text 型の列がデータに含まれる場合にのみ適用されます。注 フォーマット ファイルの各列に対して照合順序名を指定することをお勧めします。
CODEPAGE の値
説明
ACP
char、varchar、または text データ型の列は、ANSI/Microsoft Windows コード ページ (ISO 1252) から SQL Server コード ページに変換されます。
OEM (既定値)
char、varchar、または text のデータ型の列は、システムの OEM コード ページから SQL Server コード ページに変換されます。
RAW
1 つのコード ページから別のコード ページへの変換は行われません。このオプションを使用すると、最も高速に操作を完了できます。
code_page
850 など、特定のコード ページ番号を指定します。
重要 SQL Server はコード ページ 65001 (UTF-8 エンコード) をサポートしません。
DATAFILETYPE = { 'char' | 'native' | 'widechar' | 'widenative' }
BULK INSERT で、指定したデータ ファイルの型の値に基づいてインポート操作を実行します。DATAFILETYPE の値
すべてのデータが示す形式
char (既定値)
文字形式。
詳細については、「文字形式を使用したデータのインポートまたはエクスポート (SQL Server)」を参照してください。
native
ネイティブ (データベース) データ型。 bcp ユーティリティを使用して SQL Server からデータを一括インポートし、ネイティブ データ ファイルを作成します。
ネイティブ値を使用すると、char 型の値を使用するよりもパフォーマンスが向上します。
詳細については、「ネイティブ形式を使用したデータのインポートまたはエクスポート (SQL Server)」を参照してください。
widechar
Unicode 文字。
詳細については、「Unicode 文字形式を使用したデータのインポートまたはエクスポート (SQL Server)」を参照してください。
widenative
ネイティブ (データベース) データ型。ただし、データが Unicode として格納される、char、varchar、text 列は除きます。 bcp ユーティリティを使用して SQL Server からデータを一括インポートし、widenative データ ファイルを作成します。
widenative 値を使用すると、widechar 値を使用するよりもパフォーマンスが向上します。 データ ファイルに ANSI 拡張文字が含まれている場合は、widenative を指定します。
詳細については、「Unicode ネイティブ形式を使用したデータのインポートまたはエクスポート (SQL Server)」を参照してください。
FIELDTERMINATOR ='field_terminator'
char および widechar 型のデータ ファイルに使用するフィールド ターミネータを指定します。 既定のフィールド ターミネータは \t (タブ文字) です。 詳細については、「フィールド ターミネータと行ターミネータの指定 (SQL Server)」を参照してください。FIRSTROW **=**first_row
読み込み開始行の行番号を指定します。 既定値は、指定されたデータ ファイルの先頭行です。 FIRSTROW は 1 から始まります。注 FIRSTROW 属性は、列ヘッダーのスキップを目的としたものではありません。 ヘッダーのスキップは、BULK INSERT ステートメントではサポートされません。 行をスキップした場合、SQL Server データベース エンジンではフィールド ターミネータのみが調べられます。スキップした行のフィールドに含まれているデータの有効性は確認されません。
FIRE_TRIGGERS
一括読み込みの操作中に、インポート先のテーブルで定義されている挿入トリガーを実行します。 対象テーブルで INSERT 操作にトリガーが定義されている場合、そのトリガーは完了した各バッチに対して実行されます。FIRE_TRIGGERS が指定されていない場合、挿入トリガーは実行されません。
FORMATFILE ='format_file_path'
フォーマット ファイルの完全パスを指定します。 フォーマット ファイルには、格納済みの応答を含むデータ ファイルの内容が記述されています。これらの応答は同じテーブルまたはビューに対し bcp ユーティリティを実行して作成されたものです。 フォーマット ファイルは次の場合に使用します。データ ファイルに含まれる列の数が、テーブルまたはビューより多い、または少ない。
列の順序が異なる。
列の区切り記号が異なる。
データ形式に他に異なる点がある。 フォーマット ファイルは通常、bcp ユーティリティを使用して作成し、必要に応じてテキスト エディターで修正します。 詳細については、「bcp ユーティリティ」を参照してください。
KEEPIDENTITY
インポートしたデータ ファイルの ID 値 (複数可) を ID 列に使用することを指定します。 KEEPIDENTITY を指定しない場合、この列の ID 値は検証のみが行われ、インポートされません。この場合 SQL Server では、テーブルの作成時に指定された seed と増分値に基づいて、一意な値が自動的に割り当てられます。 データ ファイルにテーブルまたはビュー内の ID 列の値が含まれない場合は、フォーマット ファイルを使用して、データのインポート時にテーブルまたはビュー内の ID 列をスキップするよう指定します。SQL Server ではこの列に一意な値が自動的に割り当てられます。 詳細については、「DBCC CHECKIDENT (Transact-SQL)」を参照してください。ID 値の保持の詳細については、「データの一括インポート時の ID 値の保持 (SQL Server)」を参照してください。
KEEPNULLS
一括インポート操作時、空の列が挿入される場合は NULL 値が保持されます。その列の既定値は格納されません。 詳細については、「一括インポート中の NULL の保持または既定値の使用 (SQL Server)」を参照してください。KILOBYTES_PER_BATCH = kilobytes_per_batch
バッチあたりのデータの概算キロバイト数 (KB) を kilobytes_per_batch として指定します。 KILOBYTES_PER_BATCH の既定値はありません。 パフォーマンスに関する考慮事項については、後の「解説」を参照してください。LASTROW**=**last_row
読み込み終了行の行番号を指定します。 既定値は 0 で、これは指定のデータ ファイルの最終行を表します。MAXERRORS = max_errors
一括インポート操作時に許容されるデータの構文エラーの最大数を指定します。この最大数に達すると、操作は取り消されます。 一括インポート操作でインポートできない行は無視され、それぞれ 1 つのエラーとしてカウントされます。 max_errors を指定しない場合の既定値は 10 です。注 MAX_ERRORS オプションは、制約チェックや money および bigint のデータ型の変換には適用されません。
ORDER ( { column [ ASC | DESC ] } [ ,...n ] )
データ ファイル内のデータの並べ替え方法を指定します。 インポートするデータをテーブル上のクラスター化インデックスに従って並べ替えると、一括インポートのパフォーマンスが向上します。 データ ファイルが異なる順序で並んでいる場合、つまりクラスター化インデックス キーの順序以外の順で並んでいるか、テーブルにクラスター化インデックスが存在しない場合、ORDER 句は無視されます。 指定する列の名前は、インポート先のテーブル内で有効な列の名前であることが必要です。 既定では、一括挿入操作はデータ ファイルが並べ替えられていないことを前提に実行されます。 最適な一括インポートのため、SQL Server では、インポートするデータが並べ替えられているかどうかも確認されます。n
複数の列を指定できることを示すプレースホルダーです。ROWS_PER_BATCH **=**rows_per_batch
データ ファイル内にあるデータ行の概算数を指定します。既定では、データ ファイル内のすべてのデータは単一のトランザクションとしてサーバーに送られ、バッチ内の行数はクエリ オプティマイザーには通知されません。 ROWS_PER_BATCH を値 > 0 で指定した場合、サーバーでは一括インポート操作の最適化にこの値が使用されます。 ROWS_PER_BATCH に指定する値は、実際の行数とほぼ同じにする必要があります。 パフォーマンスに関する考慮事項については、後の「解説」を参照してください。
ROWTERMINATOR ='row_terminator'
char および widechar 型のデータ ファイルに使用する行ターミネータを指定します。 既定の行ターミネータは \r\n (改行文字) です。 詳細については、「フィールド ターミネータと行ターミネータの指定 (SQL Server)」を参照してください。TABLOCK
一括インポート操作中にテーブル レベルのロックを取得します。 テーブルにインデックスがなく、TABLOCK を指定した場合は、複数のクライアントで同時に 1 つのテーブルを読み込むことができます。 既定では、ロック動作はテーブル オプション table lock on bulk load によって決定されます。 一括インポート操作中にロックを維持すると、テーブル ロックの競合が少なくなるので、場合によってはパフォーマンスが大幅に向上します。 パフォーマンスに関する考慮事項については、後の「解説」を参照してください。ERRORFILE ='file_name'
形式エラーがあり、OLE DB 行セットに変換できない行を収集するときに使用するファイルを指定します。 該当する行は、データ ファイルからこのエラー ファイルに "そのまま" コピーされます。このエラー ファイルは、コマンドが実行されたときに作成されます。 ファイルが既に存在する場合はエラーが発生し、 拡張子 .ERROR.txt を持つ制御ファイルが作成されます。 このファイルにはエラー ファイルの各行の参照と、エラーの診断が含まれています。 エラーが修正されるとすぐ、データは読み込み可能になります。
互換性
BULK INSERT によって、ファイルから読み込んだデータに対して厳密なデータ検証とデータ チェックが実行されるので、無効なデータを使用して既存のスクリプトを実行すると、スクリプトは失敗する可能性があります。 たとえば、BULK INSERT では次の検証が行われます。
float 型と real 型のネイティブ表記が有効かどうか。
Unicode データが偶数バイト長かどうか。
データ型
文字列から 10 進数へのデータ型変換
BULK INSERT で使用される文字列から 10 進数へのデータ型変換には、Transact-SQL の CONVERT 関数と同じ規則が適用されるので、科学的表記法を使用した数値を表す文字列は拒否されます。 したがって、BULK INSERT を実行するときに、そのような文字列が無効な値として評価され、変換エラーが報告されます。
この問題を回避するには、科学的表記法の float 型のデータを 10 進数の列に一括インポートするフォーマット ファイルを使用します。 フォーマット ファイルには、列のデータを明示的に real または float 型として記述します。 これらのデータ型の詳細については、「float 型と real 型 (Transact-SQL)」を参照してください。
注 |
---|
フォーマット ファイルでは、real 型のデータが SQLFLT4 データ型として、float 型のデータが SQLFLT8 データ型として表現されます。 XML 以外のフォーマット ファイルの詳細については、「bcp を使用したファイル ストレージ型の指定 (SQL Server)」を参照してください。 |
科学的表記法を使用した数値をインポートする例
この例では、次のテーブルを使用します。
CREATE TABLE t_float(c1 float, c2 decimal (5,4))
ここでの目的は、t_float テーブルにデータを一括インポートすることです。 データ ファイル C:\t_float-c.dat には、次のような科学的表記法の float 型のデータが含まれています。
8.0000000000000002E-28.0000000000000002E-2
しかし、テーブルの 2 番目の列 c2 で decimal データ型を使用しているので、このデータを BULK INSERT によって t_float に直接インポートすることはできません。 そのため、フォーマット ファイルが必要です。 フォーマット ファイルでは、科学的表記法の float 型のデータを列 c2 の 10 進形式にマップする必要があります。
次のフォーマット ファイルでは、SQLFLT8 データ型を使用して、2 番目のデータ フィールドを 2 番目の列にマップしています。
<?xml version="1.0"?>
<BCPFORMAT xmlns="https://schemas.microsoft.com/sqlserver/2004/bulkload/format" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<RECORD>
<FIELD ID="1" xsi:type="CharTerm" TERMINATOR="\t" MAX_LENGTH="30"/>
<FIELD ID="2" xsi:type="CharTerm" TERMINATOR="\r\n" MAX_LENGTH="30"/> </RECORD> <ROW>
<COLUMN SOURCE="1" NAME="c1" xsi:type="SQLFLT8"/>
<COLUMN SOURCE="2" NAME="c2" xsi:type="SQLFLT8"/> </ROW> </BCPFORMAT>
このフォーマット ファイル (ファイル名 C:\t_floatformat-c-xml.xml) を使用してテスト テーブルにテスト データをインポートするには、次の Transact-SQL ステートメントを実行します。
BULK INSERT bulktest..t_float
FROM 'C:\t_float-c.dat' WITH (FORMATFILE='C:\t_floatformat-c-xml.xml');
GO
SQLXML ドキュメントの一括エクスポートまたは一括インポート用のデータ型
SQLXML データを一括エクスポートまたは一括インポートするには、フォーマット ファイルで次のいずれかのデータ型を使用します。
データ型 |
結果 |
---|---|
SQLCHAR または SQLVARCHAR |
データは、クライアント コード ページまたは照合順序で暗黙的に指定されるコード ページで送られます。 フォーマット ファイルを指定せずに DATAFILETYPE = 'char' を指定した場合と同じ結果が得られます。 |
SQLNCHAR または SQLNVARCHAR |
データは Unicode として送られます。 フォーマット ファイルを指定せずに DATAFILETYPE = 'widechar' を指定した場合と同じ結果が得られます。 |
SQLBINARY または SQLVARBIN |
データは変換なしで送られます。 |
全般的な解説
BULK INSERT ステートメント、INSERT ... SELECT * FROM OPENROWSET(BULK...) ステートメント、および bcp コマンドの比較については、「データの一括インポートと一括エクスポート (SQL Server)」を参照してください。
一括インポートのデータの準備については、「一括エクスポートまたは一括インポートのデータの準備 (SQL Server)」を参照してください。
BULK INSERT ステートメントは、テーブルまたはビューにデータをインポートするために、ユーザー定義のトランザクション内で実行できます。 必要に応じて、一括インポート データの複数の一致を使用するために、トランザクションは BULK INSERT ステートメントで BATCHSIZE 句を指定できます。 複数のバッチのトランザクションをロールバックする場合、トランザクションが SQL Server に送信したすべてのバッチがロールバックされます。
相互運用性
CSV ファイルからのデータのインポート
SQL Server の一括インポート操作では、コンマ区切り (CSV) ファイルがサポートされていません。 ただし、場合によっては、SQL Server に対してデータを一括インポートする際、CSV ファイルをデータ ファイルとして使用できます。 CSV データ ファイルからのデータのインポートに関する要件の詳細については、「一括エクスポートまたは一括インポートのデータの準備 (SQL Server)」を参照してください。
ログ記録の動作
一括インポート中に実行される行挿入操作がトランザクション ログに記録されるタイミングの詳細については、「一括インポートで最小ログ記録を行うための前提条件」を参照してください。
制限事項
BULK INSERT でフォーマット ファイルを使用する場合、指定できるフィールド数は 1,024 個までです。 これは、テーブルに許容される最大列数と同じです。 1,024 個を超えるフィールドが含まれるデータ ファイルで BULK INSERT を使用すると、BULK INSERT によってエラー 4822 が生成されます。 bcp ユーティリティにはこのような制限がないため、1,024 個を超えるフィールドを含むデータ ファイルには、bcp コマンドを使用してください。
パフォーマンスに関する考慮事項
1 つのバッチでフラッシュされるページの数が内部しきい値を超えると、バッチのコミット時にフラッシュするページを特定するためにバッファー プールのフル スキャンが行われる可能性があります。 フル スキャンが行われると、一括インポートのパフォーマンスが低下します。 この内部しきい値の問題は、大きなバッファー プールと遅い I/O サブシステムの組み合わせでも発生します。 大規模なコンピューターでバッファー オーバーフローを防ぐには、TABLOCK ヒントを使用しないようにするか (一括インポートの最適化は行われなくなります)、バッチ サイズを小さくします (一括インポートの最適化は引き続き行われます)。
コンピューターはそれぞれ異なるため、実際のデータでさまざまなバッチ サイズを試して最適な値を見つけるようにすることをお勧めします。
セキュリティ
セキュリティ アカウントの委任 (権限借用)
ユーザーが SQL Server ログインを使用する場合は、SQL Server プロセス アカウントのセキュリティ プロファイルが使用されます。 SQL Server 認証を使用したログインは、データベース エンジン以外では認証できません。 そのため、SQL Server 認証を使用したログインによって BULK INSERT コマンドが開始されると、SQL Server プロセス アカウント (SQL Server データベース エンジン サービスで使用されるアカウント) のセキュリティ コンテキストを使用してデータへの接続が行われます。 ソース データを正しく読み取るには、SQL Server データベース エンジンで使用されるアカウントに対して、ソース データへのアクセス権を付与する必要があります。 これに対して、SQL Server ユーザーが Windows 認証を使用してログインした場合、そのユーザーは SQL Server プロセスのセキュリティ プロファイルに関係なく、そのユーザー アカウントでアクセス可能なファイルのみを読み取ることができます。
あるコンピューターで sqlcmd または osql を使用して BULK INSERT ステートメントを実行し、2 台目のコンピューターの SQL Server にデータを挿入し、UNC パスを使用して 3 台目のコンピューターの data_file を指定した場合、エラー 4861 が返されることがあります。
この問題を解決するには、SQL Server 認証を使用し、SQL Server プロセス アカウントのセキュリティ プロファイルを使用する SQL Server ログインを指定します。または、Windows の構成でセキュリティ アカウントの委任を有効にします。 ユーザー アカウントの信頼性を委任の対象として有効にする方法の詳細については、Windows ヘルプを参照してください。
このエラーの詳細について、および BULK INSERT を使用する場合のセキュリティに関するその他の考慮事項については、「BULK INSERT または OPENROWSET(BULK...) を使用した一括データのインポート(SQL Server)」を参照してください。
権限
INSERT および ADMINISTER BULK OPERATIONS 権限が必要です。 ただし次の操作を 1 つ以上行う場合は、さらに ALTER TABLE 権限が必要になります。
制約が存在する場合に、CHECK_CONSTRAINTS オプションを指定しない。
注 制約の無効化は既定の動作です。 制約を明示的に検証するには、CHECK_CONSTRAINTS オプションを使用します。
トリガーが存在する場合に、FIRE_TRIGGER オプションを指定しない。
注 既定では、トリガーは起動しません。 トリガーを明示的に起動するには、FIRE_TRIGGERS オプションを使用します。
KEEPIDENTITY オプションを使用して、データ ファイルから ID 値をインポートする。
使用例
A. ファイルからのデータのインポートにパイプを使用する
次の例では、指定のデータ ファイルから AdventureWorks.Sales.SalesOrderDetail テーブルに注文の詳細情報をインポートします。このとき、パイプ (|) をフィールド ターミネータ、|\n を行ターミネータとして使用します。
BULK INSERT AdventureWorks2012.Sales.SalesOrderDetail
FROM 'f:\orders\lineitem.tbl'
WITH
(
FIELDTERMINATOR =' |',
ROWTERMINATOR =' |\n'
);
B. FIRE_TRIGGERS 引数を使用する
次の例では、FIRE_TRIGGERS 引数を指定します。
BULK INSERT AdventureWorks2012.Sales.SalesOrderDetail
FROM 'f:\orders\lineitem.tbl'
WITH
(
FIELDTERMINATOR =' |',
ROWTERMINATOR = ':\n',
FIRE_TRIGGERS
);
C. 行ターミネータとしてライン フィードを使用する
次の例では、UNIX 出力などのように、ライン フィードを行ターミネータとして使用するファイルをインポートします。
DECLARE @bulk_cmd varchar(1000);
SET @bulk_cmd = 'BULK INSERT AdventureWorks2012.Sales.SalesOrderDetail
FROM ''<drive>:\<path>\<filename>''
WITH (ROWTERMINATOR = '''+CHAR(10)+''')';
EXEC(@bulk_cmd);
注 |
---|
Microsoft Windows によるテキスト ファイルの処理方法によって、(\n は自動的に \r\n) に置き換えられます。 |
その他の例
BULK INSERT のその他の例については、次のトピックを参照してください。
関連項目
参照
概念
データの一括インポートと一括エクスポート (SQL Server)