この記事の内容
適用対象:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Microsoft Fabric のウェアハウス
SQL Server でユーザー指定の形式でデータベース テーブルまたはビューにデータ ファイルをインポートします。
BULK INSERT
{ database_name.schema_name.table_or_view_name | schema_name.table_or_view_name | table_or_view_name }
FROM 'data_file'
[ WITH
(
[ [ , ] DATA_SOURCE = 'data_source_name' ]
-- text formatting options
[ [ , ] CODEPAGE = { 'RAW' | 'code_page' | 'ACP' | 'OEM' } ]
[ [ , ] DATAFILETYPE = { 'char' | 'native' | 'widechar' | 'widenative' } ]
[ [ , ] ROWTERMINATOR = 'row_terminator' ]
[ [ , ] FIELDTERMINATOR = 'field_terminator' ]
[ [ , ] FORMAT = 'CSV' ]
[ [ , ] FIELDQUOTE = 'quote_characters' ]
[ [ , ] FIRSTROW = first_row ]
[ [ , ] LASTROW = last_row ]
-- input file format options
[ [ , ] FORMATFILE = 'format_file_path' ]
[ [ , ] FORMATFILE_DATA_SOURCE = 'data_source_name' ]
-- error handling options
[ [ , ] MAXERRORS = max_errors ]
[ [ , ] ERRORFILE = 'file_name' ]
[ [ , ] ERRORFILE_DATA_SOURCE = 'errorfile_data_source_name' ]
-- database options
[ [ , ] KEEPIDENTITY ]
[ [ , ] KEEPNULLS ]
[ [ , ] FIRE_TRIGGERS ]
[ [ , ] CHECK_CONSTRAINTS ]
[ [ , ] TABLOCK ]
-- source options
[ [ , ] ORDER ( { column [ ASC | DESC ] } [ , ...n ] ) ]
[ [ , ] ROWS_PER_BATCH = rows_per_batch ]
[ [ , ] KILOBYTES_PER_BATCH = kilobytes_per_batch
[ [ , ] BATCHSIZE = batch_size ]
) ]
BULK INSERT
ステートメントには、プラットフォームごとに異なる引数とオプションがあります。 相違点を次の表にまとめます。
特徴 | SQL Server | Azure SQL Database と Azure SQL Managed Instance | ファブリックデータウェアハウス |
---|---|---|---|
データ ソース | ローカル パス、ネットワーク パス (UNC)、または Azure Storage | Azure Storage | Azure Storage |
ソース認証 | Windows 認証、SAS | Microsoft Entra ID、SAS トークン、マネージド ID | Microsoft Entra ID |
サポートされていないオプション | パスにワイルドカードを * する |
パスにワイルドカードを * する |
DATA_SOURCE 、 FORMATFILE_DATA_SOURCE 、 ERRORFILE 、 ERRORFILE_DATA_SOURCE |
有効なオプション (効果なし) |
KEEPIDENTITY 、 FIRE_TRIGGERS 、 CHECK_CONSTRAINTS 、 TABLOCK 、 ORDER 、 ROWS_PER_BATCH 、 KILOBYTES_PER_BATCH 、および BATCHSIZE は適用されません。 構文エラーはスローされませんが、効果はありません |
指定のテーブルまたはビューが含まれているデータベース名。 指定しない場合、database_name は現在のデータベースです。
テーブルまたはビューのスキーマの名前を指定します。 一括インポート操作を実行するユーザーの既定のスキーマが、指定したテーブルまたはビューのスキーマと同じ場合、schema_name は省略可能です。 "スキーマ" を指定せず、さらに一括インポート操作を実行するユーザーの既定のスキーマが、指定したテーブルまたはビューのスキーマと異なる場合、SQL Server ではエラー メッセージが返され、一括インポート操作は取り消されます。
データの一括インポート先のテーブル名またはビュー名を指定します。 指定できるビューは、すべての列が同じベース テーブルを参照するビューだけです。 ビューにデータを読み込む際の制限の詳細については、 INSERT を参照してください。
指定のテーブルまたはビューにインポートするデータが含まれているデータ ファイルの完全なパスを指定します。
BULK INSERT
では、ディスクまたは Azure Blob Storage (ネットワーク、フロッピー ディスク、ハード ディスクなど) からデータをインポートできます。
BULK INSERT bing_covid_19_data
FROM 'C:\\bing_covid-19_data\public\curated\covid-19\latest\bing_covid-19_data.csv';
data_file には、SQL Server が実行されているサーバーからの有効なパスを指定する必要があります。
data_file がリモート ファイルの場合は、UNC (汎用名前付け規則) 名を指定します。 UNC 名の形式は、\\SystemName\ShareName\Path\FileName
です。 例:
BULK INSERT bing_covid_19_data
FROM '\\ShareX\bing_covid-19_data\public\curated\covid-19\latest\bing_covid-19_data.csv';
Azure SQL Database と Fabric Warehouse では、Azure Blob Storage からの読み取りのみがサポートされます。
SQL Server 2017 (14.x) 以降では、data_file は Azure Blob Storage に格納することができます。 その場合は、data_source_name
オプションも指定する必要があります。 例については、「Azure Blob Storage 内のファイルからデータをインポートする」を参照してください。
Fabric Warehouse では、ソース パスを指定するための 2 つの異なるパス スタイルがサポートされています。
https://<storage account>.blob.core.windows.net/<container name>/<path to file>
abfss://<container name>@<storage account>.dfs.core.windows.net/<path to file>
Fabric Warehouse では、URI 内の任意の文字と一致する *
ワイルドカードがサポートされており、インポートする必要があるファイルの URI パターンを定義できます。 例:
BULK INSERT bing_covid_19_data
FROM 'https://<data-lake>.blob.core.windows.net/public/curated/covid-19/bing_covid-19_data/latest/*.csv';
注意
<data-lake>.blob.core.windows.net
を適切な URL に置き換えます。
1 つのバッチに含まれている行の数を指定します。 それぞれのバッチは、1 回のトランザクションでサーバーにコピーされます。 コピーに失敗した場合、SQL Server では各バッチのトランザクションがコミットまたはロールバックされます。 既定では、指定のデータ ファイル内にあるすべてのデータが 1 つのバッチになります。 パフォーマンスに関する考慮事項については、この記事で後述する「パフォーマンスに関する考慮事項」を参照してください。
一括インポート操作中、対象テーブルまたはビューに対するすべての制約を検証します。
CHECK_CONSTRAINTS
オプションを指定しないと、CHECK
制約とFOREIGN KEY
制約は無視され、操作後、テーブルの制約は信頼されていないとマークされます。
UNIQUE
制約と PRIMARY KEY
制約は常に適用されます。
NOT NULL
制約で定義されている文字列にインポートする場合、テキスト ファイルに値がない場合は、BULK INSERT
空の文字列が挿入されます。
テーブル全体の制約は、任意の時点で必ず検証してください。 一括インポート操作の前にテーブルが空でない場合、制約を再検証するコストが、増分データに CHECK
制約を適用するコストを超える可能性があります。
入力データに制約違反の行が含まれている場合などは、制約を無効 (既定の動作) にできます。
CHECK
制約を無効にすると、データをインポートし、Transact-SQL ステートメントを使用して無効なデータを削除できます。
注意
MAXERRORS
オプションは制約チェックには適用されません。
データ ファイル内のデータのコード ページを指定します。
CODEPAGE
は、文字値が 127
より大きいか、32
未満の文字値を持つ char、varchar、またはテキスト列がデータに含まれている場合にのみ関連します。 例については、「コード ページを指定する」を参照してください。
BULK INSERT bing_covid_19_data
FROM 'https://<data-lake>.blob.core.windows.net/public/curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.csv'
WITH (CODEPAGE = '65001', FIRSTROW = 2);
注意
<data-lake>.blob.core.windows.net
を適切な URL に置き換えます。
CODEPAGE
は、LINUX for SQL Server 2017 (14.x) でサポートされているオプションではありません。 SQL Server 2019 (15.x) の場合、CODEPAGE
には'RAW'
オプションのみが許可されます。
フォーマット ファイルの各列に対して照合順序名を指定する必要があります。
CODEPAGE 値 |
説明 |
---|---|
ACP |
char、varchar、または text データ型の列は、ANSI/Microsoft Windows コード ページ (ISO 1252) から SQL Server コード ページに変換されます。 |
OEM (既定値) |
char、varchar、またはテキスト データ型の列は、システム OEM コード ページから SQL Server コード ページに変換されます。 |
RAW |
コード ページの変換は行われません。
RAW は最速のオプションです。 |
code_page | 850 など、特定のコード ページ番号を指定します。 SQL Server 2016 (13.x) より前のバージョンでは、コード ページ 65001 (UTF-8 エンコード) はサポートされていません。 |
指定 BULK INSERT
データ ファイルの種類の値を使用してインポート操作を実行することを指定します。
BULK INSERT bing_covid_19_data
FROM 'https://<data-lake>.blob.core.windows.net/public/curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.csv'
WITH (DATAFILETYPE = 'char', FIRSTROW = 2);
注意
<data-lake>.blob.core.windows.net
を適切な URL に置き換えます。
DATAFILETYPE 値 |
で表されるすべてのデータ |
---|---|
char (既定値) |
文字形式。 詳細については、「文字形式を使用したデータのインポートまたはエクスポート (SQL Server)」を参照してください。 |
native |
ネイティブ (データベース) データ型。
bcp ユーティリティを使用して SQL Server からデータを一括インポートし、ネイティブ データ ファイルを作成します。 ネイティブ値を使用すると、char 型の値を使用するよりもパフォーマンスが向上します。 ネイティブ形式は、拡張文字や 2 バイト文字セット (DBCS) の文字を含まないデータ ファイルを使用して、SQL Server の複数のインスタンス間でデータを一括転送する場合に推奨します。 詳細については、「ネイティブ形式を使用したデータのインポートまたはエクスポート」を参照してください。 |
widechar |
Unicode 文字。 詳細については、「 Unicode 文字形式を使用してデータをインポートまたはエクスポートする (SQL Server)」を参照してください。 |
widenative |
ネイティブ (データベース) データ型。ただし、データが Unicode として格納される char、varchar、text 列は除きます。
bcp ユーティリティを使用して SQL Server からデータを一括インポートして、widenative データ ファイルを作成します。widenative 値は、widechar に代わる高いパフォーマンスを提供します。 データ ファイルに ANSI 拡張文字が含まれている場合は、 widenative を指定します。詳細については、「Unicode ネイティブ形式を使用したデータのインポートまたはエクスポート (SQL Server)」を参照してください。 |
適用対象: SQL Server 2017 (14.x) 以降のバージョン、および Azure SQL Database。
インポートされるファイルの Azure Blob Storage の場所を指している名前付きの外部データ ソースを指定します。 外部データ ソースは、SQL Server 2017 (14.x) で追加された TYPE = BLOB_STORAGE
オプションを使用して作成する必要があります。 詳しくは、「CREATE EXTERNAL DATA SOURCE」をご覧ください。 例については、「Azure Blob Storage 内のファイルからデータをインポートする」を参照してください。
注意
<data-lake>.blob.core.windows.net
を適切な URL に置き換えます。
CREATE EXTERNAL DATA SOURCE pandemicdatalake
WITH (
TYPE = BLOB_STORAGE,
LOCATION = 'https://<data-lake>.blob.core.windows.net/public/'
);
GO
BULK INSERT bing_covid_19_data
FROM 'curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.csv'
WITH (DATA_SOURCE = '<data-lake>', FIRSTROW = 2, LASTROW = 100, FIELDTERMINATOR = ',');
形式エラーがあり、OLE DB 行セットに変換できない行を収集するときに使用するファイルを指定します。 該当する行は、データ ファイルからこのエラー ファイルに "そのまま" コピーされます。
このエラー ファイルは、コマンドが実行されたときに作成されます。 ファイルが既に存在する場合はエラーが発生し、 さらに、 .ERROR.txt
拡張子を持つコントロール ファイルが作成され、エラー ファイル内の各行が参照され、エラー診断が提供されます。 エラーが修正されるとすぐ、データは読み込み可能になります。
SQL Server 2017 (14.x) 以降では、error_file_path は Azure Blob Storage に格納することができます。
適用対象: SQL Server 2017 (14.x) 以降のバージョン。
インポート中に見つかったエラーを追跡するために、エラー ファイルの Azure Blob Storage の場所を指す名前付き外部データ ソースを指定します。 外部データ ソースは、SQL Server 2017 (14.x) で追加された TYPE = BLOB_STORAGE
オプションを使用して作成する必要があります。 詳しくは、「CREATE EXTERNAL DATA SOURCE」をご覧ください。
読み込み開始行の行番号を指定します。 既定値は、指定されたデータ ファイルの先頭行です。
FIRSTROW
は 1 から始まります。
BULK INSERT bing_covid_19_data
FROM 'https://<data-lake>.blob.core.windows.net/public/curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.csv'
WITH (FIRSTROW = 2);
注意
<data-lake>.blob.core.windows.net
を適切な URL に置き換えます。
FIRSTROW
属性は、列ヘッダーをスキップするためのものではありません。
BULK INSERT
ステートメントでは、ヘッダーのスキップはサポートされていません。 行をスキップすることを選択した場合、SQL Server データベース エンジンではフィールド ターミネータのみが調べられます。スキップした行のフィールドに含まれているデータの有効性は確認されません。
一括読み込みの操作中に、インポート先のテーブルで定義されている挿入トリガーを実行します。 ターゲット テーブルに対する INSERT
操作に対してトリガーが定義されている場合、完了したバッチごとにトリガーが発生します。
FIRE_TRIGGERS
が指定されていない場合、挿入トリガーは実行されません。
適用対象: SQL Server 2017 (14.x) 以降のバージョン。
インポートされたデータのスキーマを定義するために、フォーマット ファイルの Azure Blob Storage の場所を指す名前付き外部データ ソースを指定します。 外部データ ソースは、SQL Server 2017 (14.x) で追加された TYPE = BLOB_STORAGE
オプションを使用して作成する必要があります。 詳しくは、「CREATE EXTERNAL DATA SOURCE」をご覧ください。
インポートしたデータ ファイルの ID 値 (複数可) を ID 列に使用することを指定します。
KEEPIDENTITY
指定されていない場合、この列の ID 値は検証されますが、インポートされません。SQL Server では、テーブルの作成時に指定されたシード値と増分値に基づいて一意の値が自動的に割り当てられます。 データ ファイルにテーブルまたはビュー内の ID 列の値が含まれない場合は、フォーマット ファイルを使用して、データのインポート時にテーブルまたはビュー内の ID 列をスキップするよう指定します。SQL Server ではこの列に一意な値が自動的に割り当てられます。 詳細については、「DBCC CHECKIDENT」を参照してください。
詳細については、「データ の一括インポート時に ID 値を保持する (SQL Server)」を参照してください。
一括インポート操作時、空の列が挿入される場合は NULL 値が保持されます。その列の既定値は格納されません。 詳細については、「一括インポート中の NULL または既定値の保持 (SQL Server)」を参照してください。
バッチあたりのデータの概算キロバイト数 (KB) を kilobytes_per_batch として指定します。 既定では、 KILOBYTES_PER_BATCH
は不明です。 パフォーマンスに関する考慮事項については、この記事で後述する「パフォーマンスに関する考慮事項」を参照してください。
読み込み終了行の行番号を指定します。 既定値は 0 です。これは指定のデータ ファイルの最終行を表します。
一括インポート操作時に許容されるデータの構文エラーの最大数を指定します。この最大数に達すると、操作は取り消されます。 一括インポート操作でインポートできない行は無視され、それぞれ 1 つのエラーとしてカウントされます。 max_errors が指定されていない場合、既定値は 10 です。
MAX_ERRORS オプションは、制約チェックや money および bigint のデータ型の変換には適用されません。
データ ファイル内のデータの並べ替え方法を指定します。 インポートするデータをテーブル上のクラスター化インデックスに従って並べ替えると、一括インポートのパフォーマンスが向上します。 データ ファイルがクラスター化インデックス キーの順序以外の順序で並べ替えられている場合、またはテーブルにクラスター化インデックスがない場合、ORDER
句は無視されます。 指定する列の名前は、インポート先のテーブル内で有効な列の名前であることが必要です。 既定では、一括挿入操作はデータ ファイルが並べ替えられていないことを前提に実行されます。 最適な一括インポートのため、 SQL Server では、インポートするデータが並べ替えられているかどうかも検証されます。
n は複数の列を指定できることを示すプレースホルダーです。
データ ファイル内にあるデータ行の概算数を示します。
既定では、データ ファイル内のすべてのデータは単一のトランザクションとしてサーバーに送られ、バッチ内の行数はクエリ オプティマイザーには通知されません。
ROWS_PER_BATCH
(値 > 0) を指定した場合、サーバーはこの値を使用して一括インポート操作を最適化します。
ROWS_PER_BATCH
に指定する値は、実際の行数とほぼ同じにする必要があります。 パフォーマンスに関する考慮事項については、この記事で後述する「パフォーマンスに関する考慮事項」を参照してください。
一括インポート操作中にテーブル レベルのロックを取得します。 テーブルにインデックスがなく、 TABLOCK
が指定されている場合、テーブルは複数のクライアントによって同時に読み込むことができます。 既定では、ロック動作はテーブル オプション table lock on bulk loadによって決定されます。 一括インポート操作中にロックを維持すると、テーブル ロックの競合が少なくなるので、場合によってはパフォーマンスが大幅に向上します。 パフォーマンスに関する考慮事項については、この記事で後述する「パフォーマンスに関する考慮事項」を参照してください。
列ストア インデックスの場合、複数の行セットに内部的に分かれているため、ロックの動作が異なります。 各スレッドは、行セットに排他 (X) ロックを設定することで、データを各行セットに排他的に読み込み、同時データ読み込みセッションでの並列データ読み込みを可能にします。
TABLOCK
オプションを使用すると、スレッドはテーブルに対して排他ロックを行います (従来の行セットの一括更新 (BU) ロックとは異なります)。これにより、他の同時実行スレッドが同時にデータを読み込むのを防ぐことができます。
適用対象: SQL Server 2017 (14.x) 以降のバージョン。
RFC 4180 標準に準拠しているコンマ区切り値ファイルを指定します。
BULK INSERT Sales.Orders
FROM '\\SystemX\DiskZ\Sales\data\orders.csv'
WITH (FORMAT = 'CSV');
適用対象: SQL Server 2017 (14.x) 以降のバージョン。
CSV ファイルの引用符文字として使用する文字を指定します。 指定しない場合、RFC 4180 標準で定義されている引用符文字 ("
) が引用符文字として使用されます。
フォーマット ファイルの完全パスを指定します。 フォーマット ファイルには、格納済みの応答を含むデータ ファイルの内容が記述されています。これらの応答は同じテーブルまたはビューに対し bcp ユーティリティを実行して作成されたものです。 フォーマット ファイルは次の場合に使用します。
- データ ファイルに含まれる列の数が、テーブルまたはビューより多い、または少ない。
- 列の順序が異なる。
- 列の区切り記号が異なる。
- データ形式に他に変更点がある。 フォーマット ファイルは通常、bcp ユーティリティを使用して作成し、必要に応じてテキスト エディターで修正します。 詳細については、「 bcp ユーティリティ 」および「 bcp を使用したフォーマット ファイルの作成 (SQL Server)」を参照してください。
SQL Server 2017 (14.x) 以降、Azure SQL Database では、format_file_path
は Azure Blob Storage に格納することができます。
char および widechar 型のデータ ファイルに使用するフィールド ターミネータを指定します。 既定のフィールド ターミネータは \t
(タブ文字) です。 詳細については、「 フィールドターミネータと行ターミネータの指定 (SQL Server)」を参照してください。
BULK INSERT bing_covid_19_data
FROM 'https://<data-lake>.blob.core.windows.net/public/curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.csv'
WITH (FIELDTERMINATOR = ',', FIRSTROW = 2);
注意
<data-lake>.blob.core.windows.net
を適切な URL に置き換えます。
char および widechar 型のデータ ファイルに使用する行ターミネータを指定します。 既定の行ターミネータは、\r\n
(改行文字) です。 詳細については、「 フィールドターミネータと行ターミネータの指定 (SQL Server)」を参照してください。
BULK INSERT
では、ファイルから読み取られたデータの厳密なデータ検証とデータ チェックが適用されます。これにより、既存のスクリプトが無効なデータで実行されたときに失敗する可能性があります。 たとえば、次 BULK INSERT
検証します。
- float データ型または real データ型のネイティブ表記が有効かどうか。
- Unicode データが偶数バイト長かどうか。
BULK INSERT
で使用される文字列から 10 進数へのデータ型変換は、指数表記を使用する数値を表す文字列を拒否する Transact-SQL CONVERT 関数と同じ規則に従います。 そのため、 BULK INSERT
は無効な値などの文字列を扱い、変換エラーを報告します。
この問題を回避するには、科学的表記法の float 型のデータを 10 進数の列に一括インポートするフォーマット ファイルを使用します。 フォーマット ファイルには、列のデータを明示的に real または float 型として記述します。 これらのデータ型の詳細については、 float と real を参照してください。
フォーマット ファイル real データとして、 SQLFLT4 データ型と float データとして、 SQLFLT8 データ型。 XML 以外のフォーマット ファイルの詳細については、「 bcp を使用したファイル ストレージの種類の指定 (SQL Server)」を参照してください。
この例では、bulktest
データベースの次のテーブルを使用します。
CREATE TABLE dbo.t_float
(
c1 FLOAT,
c2 DECIMAL (5, 4)
);
ここでの目的は、t_float
テーブルにデータを一括インポートすることです。 データ ファイル C:\t_float-c.dat
には、指数表記 の float データが含まれています。次に例を示します。
8.0000000000000002E-2 8.0000000000000002E-2
このサンプルをコピーするときは、タブ文字 (\t) をスペースとして保存するさまざまなテキスト エディターとエンコードに注意してください。 このサンプルでは、後でタブ文字を指定する必要があります。
ただし、BULK INSERT
2 番目の列c2
では 10 進データ型が使用されるため、このデータをt_float
に直接インポートすることはできません。 そのため、フォーマット ファイルが必要です。 フォーマット ファイルでは、科学的表記法の float 型のデータを列 c2
の 10 進形式にマップする必要があります。
次のフォーマット ファイルでは 、SQLFLT8 データ型を使用して、2 番目のデータ フィールドを 2 番目の列にマップします。
<?xml version="1.0"?>
<BCPFORMAT xmlns="http://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.dbo.t_float
FROM 'C:\t_float-c.dat'
WITH (FORMATFILE = 'C:\t_floatformat-c-xml.xml');
重要
Azure SQL Database と Fabric Warehouse では、Azure Blob Storage からの読み取りのみがサポートされます。
SQLXML データを一括エクスポートまたは一括インポートするには、フォーマット ファイルで次のいずれかのデータ型を使用します。
データ型 | 結果 |
---|---|
SQLCHAR または SQLVARCHAR の を する | データは、クライアント コード ページまたは照合順序で暗黙的に指定されるコード ページで送られます。 結果は、フォーマット ファイルを指定せずに DATAFILETYPE = 'char' を指定する場合と同じです。 |
SQLNCHAR または SQLNVARCHAR する | データは Unicode として送られます。 結果は、フォーマット ファイルを指定せずに DATAFILETYPE = 'widechar' を指定する場合と同じです。 |
SQLBINARY または SQLVARBIN の を する | データは変換なしで送られます。 |
BULK INSERT
ステートメント、INSERT ... SELECT * FROM OPENROWSET(BULK...)
ステートメント、および bcp
コマンドの比較については、「データの一括インポートとエクスポート (SQL Server)」を参照してください。
一括インポート用のデータの準備については、「一括 エクスポートまたは一括インポートのためのデータの準備」を参照してください。
BULK INSERT
ステートメントは、ユーザー定義トランザクション内で実行して、テーブルまたはビューにデータをインポートできます。 必要に応じて、データの一括インポートに複数の一致を使用するために、トランザクションで BULK INSERT
ステートメントで BATCHSIZE
句を指定できます。 複数バッチ トランザクションがロールバックされると、SQL Server に送信されたトランザクションのすべてのバッチがロールバックされます。
SQL Server 2017 (14.x) 以降、 BULK INSERT
では、Azure SQL Database と同様に CSV 形式がサポートされます。
SQL Server 2017 (14.x) より前は、SQL Server の一括インポート操作ではコンマ区切り値 (CSV) ファイルがサポートされていません。 ただし、場合によっては、 SQL Serverに対してデータを一括インポートする際、CSV ファイルをデータ ファイルとして使用できます。 CSV データ ファイルからデータをインポートするための要件については、「 一括エクスポートまたは一括インポートのためのデータの準備」を参照してください。
SQL Server への一括インポートによって実行される行挿入操作がトランザクション ログに記録されるタイミングについては、「 一括インポートでの最小ログ記録の前提条件」を参照してください。 最小ログ記録は、Azure SQL Database ではサポートされていません。
BULK INSERT
でフォーマット ファイルを使用する場合は、最大 1,024 個のフィールドのみを指定できます。 これは、テーブルに許容される最大列数と同じです。 1,024 個を超えるフィールドを含むデータ ファイルを含む BULK INSERT
でフォーマット ファイルを使用すると、 BULK INSERT
は 4822 エラーを生成します。
bcp ユーティリティにはこの制限がないため、1,024 を超えるフィールドを含むデータ ファイルの場合は、フォーマット ファイルなしでBULK INSERT
を使用するか、bcp コマンドを使用します。
1 つのバッチでフラッシュされるページの数が内部しきい値を超えると、バッチのコミット時にフラッシュするページを特定するためにバッファー プールのフル スキャンが行われる可能性があります。 フル スキャンが行われると、一括インポートのパフォーマンスが低下します。 この内部しきい値の問題は、大きなバッファー プールと遅い I/O サブシステムの組み合わせでも発生します。 大規模なマシンでバッファー オーバーフローを回避するには、 TABLOCK
ヒントを使用しない (一括最適化を削除する) か、より小さいバッチ サイズ (一括最適化を保持する) を使用します。
実際のデータの読み込みにはさまざまなバッチ サイズを試し、最適なサイズを見つける必要があります。 バッチ サイズにはロールバックによる部分的な影響があることに注意してください。 プロセスが失敗し、 BULK INSERT
をもう一度使用する前に、エラーが発生する前に、正常に挿入された行の一部を削除するために、追加の手動作業が必要になる場合があります。
Azure SQL Database では、大量のデータをインポートする場合は、インポートの前にデータベースまたはインスタンスのパフォーマンス レベルを一時的に上げることを検討してください。
ユーザーが 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 にデータをインポートする」を参照してください。
Azure Blob Storage からインポートし、データがパブリック (匿名アクセス) でない場合は、MASTER KEY で暗号化された SAS キーに基づいて DATABASE SCOPED CREDENTIAL を作成し、BULK INSERT
コマンドで使用する外部データベース ソースを作成します。
または、 に基づいて MANAGED IDENTITY
を作成し、非パブリック ストレージ アカウントでのデータ アクセスの要求を承認します。
MANAGED IDENTITY
を使用する場合、必要な Azure Blob Storage コンテナーのマネージド ID の読み書きのアクセスを提供する、組み込みのストレージ BLOB データ共同作成者の Azure ロールベースのアクセス制御 (RBAC) ロールを追加して、Azure ストレージは、インスタンスのマネージド ID にアクセス許可を付与する必要があります。 Azure SQL Managed Instance には、システム割り当てマネージド ID があり、さらに 1 つ以上のユーザー割り当てマネージド ID がある場合があります。 システム割り当てマネージド ID またはユーザー割り当てマネージド ID のいずれかを使って要求を認可できます。 承認のために、マネージド インスタンスの default
ID が使用されます (つまり、プライマリ ユーザー割り当てマネージド ID、またはユーザー割り当てマネージド ID が指定されていない場合はシステム割り当てマネージド ID)。 例については、「Azure Blob Storage 内のファイルからデータをインポートする」を参照してください。
重要
マネージド ID は、Azure SQL および SQL Server 2025 (17.x) プレビュー以降のバージョンに適用されます。
次のアクセス許可は、データが一括インポートされる場所 (ターゲット) に適用されます。
INSERT
とADMINISTER BULK OPERATIONS
のアクセス許可が必要です。 Azure SQL Database では、 INSERT
と ADMINISTER DATABASE BULK OPERATIONS
のアクセス許可が必要です。
ADMINISTER BULK OPERATIONS
SQL Server on Linux では、アクセス許可または bulkadmin ロールはサポートされていません。 SQL Server on Linux に対して一括挿入を実行できるのは、sysadmin だけです。
さらに、次の 1 つ以上の条件に該当する場合は、 ALTER TABLE
アクセス許可が必要です。
制約が存在し、
CHECK_CONSTRAINTS
オプションが指定されていません。制約の無効化は既定の動作です。 制約を明示的に確認するには、
CHECK_CONSTRAINTS
オプションを使用します。トリガーが存在し、
FIRE_TRIGGER
オプションが指定されていません。既定では、トリガーは起動しません。 トリガーを明示的に起動するには、
FIRE_TRIGGER
オプションを使用します。データ ファイルから ID 値をインポートするには、
KEEPIDENTITY
オプションを使用します。
この記事のコード サンプルでは、AdventureWorks2022
または AdventureWorksDW2022
サンプル データベースを使用します。このサンプル データベースは、Microsoft SQL Server サンプルとコミュニティ プロジェクト ホーム ページからダウンロードできます。
重要
Azure SQL Database と Fabric Warehouse では、Azure Blob Storage からの読み取りのみがサポートされます。
次の例では、パイプ (AdventureWorks2022.Sales.SalesOrderDetail
) をフィールド ターミネータ、|
を行ターミネータとして使用し、指定のデータ ファイルから |\n
テーブルに、注文の詳細情報をインポートします。
BULK INSERT AdventureWorks2022.Sales.SalesOrderDetail
FROM 'f:\orders\lineitem.tbl'
WITH (FIELDTERMINATOR = ' |', ROWTERMINATOR = ' |\n');
次の例では、FIRE_TRIGGERS
引数を指定します。
BULK INSERT AdventureWorks2022.Sales.SalesOrderDetail
FROM 'f:\orders\lineitem.tbl'
WITH (FIELDTERMINATOR = ' |', ROWTERMINATOR = ':\n', FIRE_TRIGGERS);
次の例では、UNIX 出力などのように、ライン フィードを行ターミネータとして使用するファイルをインポートします。
DECLARE @bulk_cmd AS VARCHAR (1000);
SET @bulk_cmd = 'BULK INSERT AdventureWorks2022.Sales.SalesOrderDetail
FROM ''<drive>:\<path>\<filename>''
WITH (ROWTERMINATOR = ''' + CHAR(10) + ''')';
EXECUTE (@bulk_cmd);
注意
Windows では、 \n
は自動的に \r\n
に置き換えられます。
コード ページを指定する例を次に示します。
BULK INSERT MyTable
FROM 'D:\data.csv'
WITH (CODEPAGE = '65001', DATAFILETYPE = 'char', FIELDTERMINATOR = ',');
次の例は、;
をフィールド ターミネータ、0x0a
を行ターミネータとして使用して、ヘッダー (先頭行) をスキップして CSV ファイルを指定する方法を示しています。
BULK INSERT Sales.Invoices
FROM '\\share\invoices\inv-2016-07-25.csv'
WITH (
FORMAT = 'CSV',
FIRSTROW = 2,
FIELDQUOTE = '\',
FIELDTERMINATOR = ';',
ROWTERMINATOR = '0x0a'
);
次の例は、CODEPAGE
をフィールド ターミネータ、65001
を行ターミネータとして使用して、ヘッダー (先頭行) をスキップして UTF-8 形式で (;
の 0x0a
を使用して) CSV ファイルを指定する方法を示しています。
BULK INSERT Sales.Invoices
FROM '\\share\invoices\inv-2016-07-25.csv'
WITH (
CODEPAGE = '65001',
FORMAT = 'CSV',
FIRSTROW = 2,
FIELDQUOTE = '\',
FIELDTERMINATOR = ';',
ROWTERMINATOR = '0x0a'
);
次の例では、Shared Access Signature (SAS) を作成した Azure Blob Storage の場所にある CSV ファイルからデータを読み込む方法を示します。 Azure Blob Storage の場所は外部データ ソースとして構成されます。これには、ユーザー データベースのマスター キーを使用して暗号化された SAS キーを使用したデータベース スコープの資格情報が必要です。
--> Optional - a MASTER KEY is not required if a DATABASE SCOPED CREDENTIAL is not required because the blob is configured for public (anonymous) access!
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>';
GO
--> Optional - a DATABASE SCOPED CREDENTIAL is not required because the blob is configured for public (anonymous) access!
CREATE DATABASE SCOPED CREDENTIAL MyAzureBlobStorageCredential
WITH IDENTITY = 'SHARED ACCESS SIGNATURE', SECRET = '******srt=sco&sp=rwac&se=2017-02-01T00:55:34Z&st=2016-12-29T16:55:34Z***************';
-- NOTE: Make sure that you don't have a leading ? in SAS token, and
-- that you have at least read permission on the object that should be loaded srt=o&sp=r, and
-- that expiration period is valid (all dates are in UTC time)
CREATE EXTERNAL DATA SOURCE MyAzureBlobStorage
WITH (
TYPE = BLOB_STORAGE,
LOCATION = 'https://****************.blob.core.windows.net/invoices',
CREDENTIAL = MyAzureBlobStorageCredential
--> CREDENTIAL is not required if a blob is configured for public (anonymous) access!
);
BULK INSERT Sales.Invoices
FROM 'inv-2017-12-08.csv'
WITH (DATA_SOURCE = 'MyAzureBlobStorage');
次の例では、 BULK INSERT
コマンドを使用して、マネージド ID を使用して Azure Blob Storage の場所にある csv ファイルからデータを読み込む方法を示します。 Azure Blob Storage の場所は、外部データ ソースとして構成されます。
--> Optional - a MASTER KEY is not required if a DATABASE SCOPED CREDENTIAL is not required because the blob is configured for public (anonymous) access!
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>';
GO
--> Optional - a DATABASE SCOPED CREDENTIAL is not required because the blob is configured for public (anonymous) access!
CREATE DATABASE SCOPED CREDENTIAL MyAzureBlobStorageCredential
WITH IDENTITY = 'Managed Identity';
-- NOTE: Make sure you have granted Storage Bob Data Contributor RBAC on storage to provides read/write access to the managed identity for the necessary Azure Blob Storage containers.
CREATE EXTERNAL DATA SOURCE MyAzureBlobStorage
WITH (
TYPE = BLOB_STORAGE,
LOCATION = 'https://****************.blob.core.windows.net/invoices',
CREDENTIAL = MyAzureBlobStorageCredential
--> CREDENTIAL is not required if a blob is configured for public (anonymous) access!
);
BULK INSERT Sales.Invoices
FROM 'inv-2017-12-08.csv'
WITH (DATA_SOURCE = 'MyAzureBlobStorage');
重要
マネージド ID は、Azure SQL および SQL Server 2025 (17.x) プレビュー以降のバージョンに適用されます。
次の例は、外部データ ソースとして構成されている Azure Blob Storage の場所に CSV ファイルからデータを読み込む方法と、エラー ファイルを指定する方法を示しています。 共有アクセス署名を使用して、データベース スコープの資格情報が必要です。 Azure SQL Database で実行している場合は、 ERRORFILE
オプションに ERRORFILE_DATA_SOURCE
必要があります。そうしないと、インポートが失敗し、アクセス許可エラーが発生する可能性があります。
ERRORFILE
で指定されたファイルはコンテナーに存在しません。
BULK INSERT Sales.Invoices
FROM 'inv-2017-12-08.csv'
WITH (
DATA_SOURCE = 'MyAzureInvoices',
FORMAT = 'CSV',
ERRORFILE = 'MyErrorFile',
ERRORFILE_DATA_SOURCE = 'MyAzureInvoices'
);
資格情報と外部データ ソースの構成を含む完全な BULK INSERT
例については、「 Azure Blob Storage のデータへの一括アクセスの例を参照してください。
BULK INSERT
のその他の例については、次の記事をご覧ください。
- XML ドキュメントの一括インポートと一括エクスポートの例 (SQL Server)
- データの一括インポート時の ID 値の保持 (SQL Server)
- 一括インポート中の NULL または既定値の保持 (SQL Server)
- フィールドターミネータと行ターミネータを指定する (SQL Server)
- データの一括インポートでのフォーマット ファイルの使用 (SQL Server)
- 文字形式を使用したデータのインポートまたはエクスポート (SQL Server)
- ネイティブ形式を使用したデータのインポートまたはエクスポート (SQL Server)
- Unicode 文字形式を使用してデータをインポートまたはエクスポートする (SQL Server)
- Unicode ネイティブ形式を使用したデータのインポートまたはエクスポート (SQL Server)
- フォーマット ファイルを使用してテーブル列をスキップする (SQL Server)
- フォーマット ファイルを使用したテーブル列とデータ ファイル フィールドのマッピング (SQL Server)