適用対象: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' | 'widechar' | 'native' | '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
{ 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 = { 'code_page' | 'ACP' } ]
[ [ , ] DATAFILETYPE = { 'char' | 'widechar' } ]
[ [ , ] ROWTERMINATOR = 'row_terminator' ]
[ [ , ] FIELDTERMINATOR = 'field_terminator' ]
[ [ , ] FORMAT = { 'CSV' | 'PARQUET' } ]
[ [ , ] 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' ]
) ]
引数
BULK INSERT ステートメントには、プラットフォームごとに異なる引数とオプションがあります。 相違点を次の表にまとめます。
| 特徴 | SQL Server | Azure SQL Database と Azure SQL Managed Instance | ファブリックデータウェアハウス |
|---|---|---|---|
| データ ソース | ローカル パス、ネットワーク パス (UNC)、または Azure Storage | Azure Storage | アズール・ストレージ、ワン・レイク |
| ソース認証 | Windows 認証、SAS | Microsoft Entra ID、SAS トークン、マネージド ID | Microsoft Entra ID |
| サポートされていないオプション |
* パスのワイルドカード、 FORMAT = 'PARQUET' |
* パスのワイルドカード、 FORMAT = 'PARQUET' |
DATAFILETYPE = {'native' | 'widenative'} |
| 有効なオプション (効果なし) |
KEEPIDENTITY、 FIRE_TRIGGERS、 CHECK_CONSTRAINTS、 TABLOCK、 ORDER、 ROWS_PER_BATCH、 KILOBYTES_PER_BATCH、および BATCHSIZE は適用されません。 構文エラーはスローされませんが、効果はありません |
database_name
指定のテーブルまたはビューが含まれているデータベース名。 指定しない場合、database_name は現在のデータベースです。
schema_name
テーブルまたはビューのスキーマの名前を指定します。 一括インポート操作を実行するユーザーの既定のスキーマが、指定したテーブルまたはビューのスキーマと同じ場合、schema_name は省略可能です。 "スキーマ" を指定せず、さらに一括インポート操作を実行するユーザーの既定のスキーマが、指定したテーブルまたはビューのスキーマと異なる場合、SQL Server ではエラー メッセージが返され、一括インポート操作は取り消されます。
table_name
データの一括インポート先のテーブル名またはビュー名を指定します。 指定できるビューは、すべての列が同じベース テーブルを参照するビューだけです。 ビューにデータを読み込む際の制限の詳細については、 INSERT を参照してください。
「data_file」から
指定のテーブルまたはビューにインポートするデータが含まれているデータ ファイルの完全なパスを指定します。
BULK INSERT ディスクやAzureストレージ(ネットワーク、フロッピーディスク、ハードディスクなど)からデータをインポートできます。
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 Data WarehouseはURIからのデータの読み込みをサポートしていますが、オンプレミスのファイルパスはサポートしていません。
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';
SQL Server 2017(14.x)以降は、 data_file をAzure Storageに配置できるようになりました。 その場合は、data_source_name オプションも指定する必要があります。 例としては、 Azure Storageのファイルからデータをインポートする項目を参照してください。
Fabric Data 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 Data 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 に置き換えます。
データソース
対象:SQL Server 2017(14.x)以降のバージョン、Azure SQL Database、Microsoft FabricのWarehouse。
ファイルインポートのためにAzure Storageのルート位置を指す名前付きの外部データソースを指定します。
CREATE EXTERNAL DATA SOURCE pandemicdatalake
WITH (LOCATION = 'https://<data-lake>.blob.core.windows.net/public/');
注
<data-lake>.blob.core.windows.netを適切な URL に置き換えます。
詳しくは、「CREATE EXTERNAL DATA SOURCE」をご覧ください。
FROM節のファイルパスは相対パスでなければならず、外部データソースで定義されたルート位置に付加されます。
BULK INSERT bing_covid_19_data
FROM 'curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.csv'
WITH (DATA_SOURCE = 'pandemicdatalake', FIRSTROW = 2, LASTROW = 100, FIELDTERMINATOR = ',');
注
簡便さのため、以下の例は相対パスとあらかじめ定義された外部データソースを使用しています。
CODEPAGE
データ ファイル内のデータのコード ページを指定します。
CODEPAGEは、文字値が より大きいか、未満の文字値を持つ char、127、または32列がデータに含まれている場合にのみ関連します。 例については、「コード ページを指定する」を参照してください。
BULK INSERT bing_covid_19_data
FROM '/curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.csv'
WITH (DATA_SOURCE = 'pandemicdatalake', FIRSTROW = 2, CODEPAGE = '65001');
CODEPAGE は、LINUX for SQL Server 2017 (14.x) でサポートされているオプションではありません。 SQL Server 2019 (15.x) の場合、'RAW'にはCODEPAGE オプションのみが許可されます。
フォーマット ファイルの各列に対して照合順序名を指定する必要があります。
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 エンコード) はサポートされていません。 |
CODEPAGE 値 |
説明 |
|---|---|
ACP |
char、varchar、または text データ型の列は、ANSI/Microsoft Windows コード ページ (ISO 1252) から SQL Server コード ページに変換されます。 |
| code_page | 850 など、特定のコード ページ番号を指定します。 SQL Server 2016 (13.x) より前のバージョンでは、コード ページ 65001 (UTF-8 エンコード) はサポートされていません。 |
DATAFILETYPE
指定 BULK INSERT データ ファイルの種類の値を使用してインポート操作を実行することを指定します。
BULK INSERT bing_covid_19_data
FROM 'curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.csv'
WITH (DATA_SOURCE = 'pandemicdatalake', FIRSTROW = 2, DATAFILETYPE = 'char');
注
<data-lake>.blob.core.windows.netを適切な URL に置き換えます。
DATAFILETYPE 値 |
で表されるすべてのデータ |
|---|---|
char (既定値) |
文字形式。 詳細については、「 文字フォーマットを使ってデータをインポートまたはエクスポートする」をご覧ください。 |
widechar |
Unicode 文字。 詳細については、「 データをインポートまたはエクスポートするためのUnicode文字フォーマット」をご覧ください。 |
native |
ネイティブ (データベース) データ型。
bcp ユーティリティを使用して SQL Server からデータを一括インポートし、ネイティブ データ ファイルを作成します。 ネイティブ値を使用すると、char 型の値を使用するよりもパフォーマンスが向上します。 ネイティブ形式は、拡張文字や 2 バイト文字セット (DBCS) の文字を含まないデータ ファイルを使用して、SQL Server の複数のインスタンス間でデータを一括転送する場合に推奨します。 詳細については、「 ネイティブフォーマットでデータのインポートまたはエクスポートをする」をご覧ください。 |
widenative |
ネイティブ (データベース) データ型。ただし、データが Unicode として格納される char、varchar、text 列は除きます。
widenative ユーティリティを使用して SQL Server からデータを一括インポートして、 データ ファイルを作成します。widenative値は、widecharに代わる高いパフォーマンスを提供します。 データ ファイルに ANSI 拡張文字が含まれている場合は、 widenativeを指定します。詳細については、「 Unicodeネイティブフォーマットを使ってデータのインポートまたはエクスポート」をご覧ください。 |
DATAFILETYPE 値 |
で表されるすべてのデータ |
|---|---|
char (既定値) |
文字形式。 詳細については、「 文字フォーマットを使ってデータをインポートまたはエクスポートする」をご覧ください。 |
widechar |
Unicode 文字。 詳細については、「 データをインポートまたはエクスポートするためのUnicode文字フォーマット」をご覧ください。 |
MAXERRORS
一括インポート操作時に許容されるデータの構文エラーの最大数を指定します。この最大数に達すると、操作は取り消されます。 一括インポート操作でインポートできない行は無視され、それぞれ 1 つのエラーとしてカウントされます。 max_errors が指定されていない場合、既定値は 10 です。
BULK INSERT bing_covid_19_data
FROM 'curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.csv'
WITH (DATA_SOURCE = 'pandemicdatalake', MAXERRORS = 0);
MAX_ERRORSオプションは制約チェックやマネー・ビジントのデータ型変換には適用されません。
エラーファイル
形式エラーがあり、OLE DB 行セットに変換できない行を収集するときに使用するファイルを指定します。 該当する行は、データ ファイルからこのエラー ファイルに "そのまま" コピーされます。
BULK INSERT bing_covid_19_data
FROM 'curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.csv'
WITH (DATA_SOURCE = 'pandemicdatalake',
ERRORFILE = 'https://<data-lake>.blob.core.windows.net/public/curated/covid-19/bing_covid-19_data/latest/errors');
注
<data-lake>.blob.core.windows.netを適切な URL に置き換えます。
このエラー ファイルは、コマンドが実行されたときに作成されます。 ファイルが既に存在する場合はエラーが発生し、 さらに、 .ERROR.txt 拡張子を持つコントロール ファイルが作成され、エラー ファイル内の各行が参照され、エラー診断が提供されます。 エラーが修正されるとすぐ、データは読み込み可能になります。
SQL Server 2017(14.x)以降は、 error_file_path がAzure Storageに設置できるようになりました。
ERRORFILE_DATA_SOURCE_NAME
適用対象: SQL Server 2017 (14.x) 以降のバージョン。
インポート中に検出されたエラーを追跡するために、エラーファイルのAzure Storageの場所を指す名前付きの外部データソースを指定します。
BULK INSERT bing_covid_19_data
FROM 'curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.csv'
WITH (
DATA_SOURCE = 'pandemicdatalake',
ERRORFILE = 'curated/covid-19/bing_covid-19_data/latest/errors',
ERRORFILE_DATA_SOURCE = 'pandemicdatalake'
);
外部データソースの作成についての詳細は、「 CREATE EXTERNAL DATA SOURCE」をご覧ください。
ファーストロー
読み込み開始行の行番号を指定します。 既定値は、指定されたデータ ファイルの先頭行です。
FIRSTROW は 1 から始まります。
BULK INSERT bing_covid_19_data
FROM 'curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.csv'
WITH (DATA_SOURCE = 'pandemicdatalake', FIRSTROW = 2);
FIRSTROW属性は、列ヘッダーをスキップするためのものではありません。
BULK INSERT ステートメントでは、ヘッダーのスキップはサポートされていません。 行をスキップすることを選択した場合、SQL Server データベース エンジンではフィールド ターミネータのみが調べられます。スキップした行のフィールドに含まれているデータの有効性は確認されません。
ラストロー
読み込み終了行の行番号を指定します。 既定値は 0 です。これは指定のデータ ファイルの最終行を表します。
バッチサイズ
1 つのバッチに含まれている行の数を指定します。 それぞれのバッチは、1 回のトランザクションでサーバーにコピーされます。 コピーに失敗した場合、SQL Server では各バッチのトランザクションがコミットまたはロールバックされます。 既定では、指定のデータ ファイル内にあるすべてのデータが 1 つのバッチになります。 パフォーマンスに関する考慮事項については、この記事で後述する「パフォーマンスに関する考慮事項」を参照してください。
CHECK_CONSTRAINTS
一括インポート操作中、対象テーブルまたはビューに対するすべての制約を検証します。
CHECK_CONSTRAINTS オプションを指定しないと、CHECK制約とFOREIGN KEY制約は無視され、操作後、テーブルの制約は信頼されていないとマークされます。
UNIQUE 制約と PRIMARY KEY 制約は常に適用されます。
NOT NULL制約で定義されている文字列にインポートする場合、テキスト ファイルに値がない場合は、BULK INSERT空の文字列が挿入されます。
テーブル全体の制約は、任意の時点で必ず検証してください。 一括インポート操作の前にテーブルが空でない場合、制約を再検証するコストが、増分データに CHECK 制約を適用するコストを超える可能性があります。
入力データに制約違反の行が含まれている場合などは、制約を無効 (既定の動作) にできます。
CHECK制約を無効にすると、データをインポートし、Transact-SQL ステートメントを使用して無効なデータを削除できます。
注
MAXERRORS オプションは制約チェックには適用されません。
発火トリガー
一括読み込みの操作中に、インポート先のテーブルで定義されている挿入トリガーを実行します。 ターゲット テーブルに対する INSERT 操作に対してトリガーが定義されている場合、完了したバッチごとにトリガーが発生します。
FIRE_TRIGGERSが指定されていない場合、挿入トリガーは実行されません。
アイデンティティを維持
インポートしたデータ ファイルの ID 値 (複数可) を ID 列に使用することを指定します。
KEEPIDENTITY指定されていない場合、この列の ID 値は検証されますが、インポートされません。SQL Server では、テーブルの作成時に指定されたシード値と増分値に基づいて一意の値が自動的に割り当てられます。 データ ファイルにテーブルまたはビュー内の ID 列の値が含まれない場合は、フォーマット ファイルを使用して、データのインポート時にテーブルまたはビュー内の ID 列をスキップするよう指定します。SQL Server ではこの列に一意な値が自動的に割り当てられます。 詳細については、「DBCC CHECKIDENT」を参照してください。
詳細については、識別値の保持については「 データをまとめ取り時の識別値を保持する」をご覧ください。
KEEPNULLS (英語)
一括インポート操作時、空の列が挿入される場合は NULL 値が保持されます。その列の既定値は格納されません。 詳細については、「 一括インポート時のnullsまたはデフォルト値を保持する」をご覧ください。
KILOBYTES_PER_BATCH
バッチあたりのデータの概算キロバイト数 (KB) を kilobytes_per_batch として指定します。 既定では、 KILOBYTES_PER_BATCH は不明です。 パフォーマンスに関する考慮事項については、この記事で後述する「パフォーマンスに関する考慮事項」を参照してください。
命令
データ ファイル内のデータの並べ替え方法を指定します。 インポートするデータをテーブル上のクラスター化インデックスに従って並べ替えると、一括インポートのパフォーマンスが向上します。 データ ファイルがクラスター化インデックス キーの順序以外の順序で並べ替えられている場合、またはテーブルにクラスター化インデックスがない場合、ORDER 句は無視されます。 指定する列の名前は、インポート先のテーブル内で有効な列の名前であることが必要です。 既定では、一括挿入操作はデータ ファイルが並べ替えられていないことを前提に実行されます。 最適な一括インポートのため、 SQL Server では、インポートするデータが並べ替えられているかどうかも検証されます。
n は複数の列を指定できることを示すプレースホルダーです。
ROWS_PER_BATCH
データ ファイル内にあるデータ行の概算数を示します。
既定では、データ ファイル内のすべてのデータは単一のトランザクションとしてサーバーに送られ、バッチ内の行数はクエリ オプティマイザーには通知されません。
ROWS_PER_BATCH (値 > 0) を指定した場合、サーバーはこの値を使用して一括インポート操作を最適化します。
ROWS_PER_BATCHに指定する値は、実際の行数とほぼ同じにする必要があります。 パフォーマンスに関する考慮事項については、この記事で後述する「パフォーマンスに関する考慮事項」を参照してください。
タブロック
一括インポート操作中にテーブル レベルのロックを取得します。 テーブルにインデックスがなく、 TABLOCK が指定されている場合、テーブルは複数のクライアントによって同時に読み込むことができます。 既定では、ロック動作はテーブル オプション table lock on bulk loadによって決定されます。 一括インポート操作中にロックを維持すると、テーブル ロックの競合が少なくなるので、場合によってはパフォーマンスが大幅に向上します。 パフォーマンスに関する考慮事項については、この記事で後述する「パフォーマンスに関する考慮事項」を参照してください。
列ストア インデックスの場合、複数の行セットに内部的に分かれているため、ロックの動作が異なります。 各スレッドは、行セットに排他 (X) ロックを設定することで、データを各行セットに排他的に読み込み、同時データ読み込みセッションでの並列データ読み込みを可能にします。
TABLOCK オプションを使用すると、スレッドはテーブルに対して排他ロックを行います (従来の行セットの一括更新 (BU) ロックとは異なります)。これにより、他の同時実行スレッドが同時にデータを読み込むのを防ぐことができます。
入力ファイル フォーマットのオプション
FORMAT
適用対象: SQL Server 2017 (14.x) 以降のバージョン。
RFC 4180 標準に準拠しているコンマ区切り値ファイルを指定します。
BULK INSERT bing_covid_19_data
FROM 'curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.csv'
WITH (DATA_SOURCE = 'pandemicdatalake', FORMAT = 'CSV');
Fabric Data Warehouseでは、 BULK INSERT 文は COPY INTO 文と同じフォーマットをサポートしているため、 FORMAT = 'PARQUET' もサポートされています。
フィールドクォート
適用対象: SQL Server 2017 (14.x) 以降のバージョン。
CSV ファイルの引用符文字として使用する文字を指定します。 指定しない場合、" 標準で定義されている引用符文字 () が引用符文字として使用されます。
FORMATFILE
フォーマット ファイルの完全パスを指定します。 フォーマット ファイルには、格納済みの応答を含むデータ ファイルの内容が記述されています。これらの応答は同じテーブルまたはビューに対し bcp ユーティリティを実行して作成されたものです。
BULK INSERT bing_covid_19_data
FROM 'curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.csv'
WITH (DATA_SOURCE = 'pandemicdatalake',
FORMATFILE = 'https://<data-lake>.blob.core.windows.net/public/curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.fmt');
注
<data-lake>.blob.core.windows.netを適切な URL に置き換えます。
フォーマット ファイルは次の場合に使用します。
- データ ファイルに含まれる列の数が、テーブルまたはビューより多い、または少ない。
- 列の順序が異なる。
- 列の区切り記号が異なる。
- データ形式に他に変更点がある。 フォーマット ファイルは通常、bcp ユーティリティを使用して作成し、必要に応じてテキスト エディターで修正します。 詳細については、 bcp ユーティリティ と bcp でフォーマットファイルを作成する方法をご覧ください。
SQL Server 2017(14.x)以降、Azure SQL Databaseでは format_file_path Azure Storageに配置できるようになりました。
FORMATFILE_DATA_SOURCE
適用対象: SQL Server 2017 (14.x) 以降のバージョン。
インポートされたデータのスキーマを定義するために、フォーマットファイルのAzure Storage位置を指す名前付きの外部データソースを指定します。
BULK INSERT bing_covid_19_data
FROM 'curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.csv'
WITH (
DATA_SOURCE = 'pandemicdatalake',
FORMATFILE = 'curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.fmt',
FORMATFILE_DATA_SOURCE = 'pandemicdatalake'
);
FIELDTERMINATOR
charおよびwidecharデータファイルに使用されるフィールド終端器を指定します。 既定のフィールド ターミネータは \t (タブ文字) です。 詳細については、「 フィールドターミネータと行ターミネータを指定する」を参照してください。
BULK INSERT bing_covid_19_data
FROM '/curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.csv'
WITH (DATA_SOURCE = 'pandemicdatalake', FIELDTERMINATOR = ',', FIRSTROW = 2);
ROWTERMINATOR
charおよびwidecharデータファイルに使用される行終端を指定します。
BULK INSERT bing_covid_19_data
FROM '/curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.csv'
WITH (DATA_SOURCE = 'pandemicdatalake', ROWTERMINATOR = '\r\n', FIRSTROW = 2);
デフォルトの行終端は \r\n (キャリッジリターンと改行文字)です。 詳細については、「 フィールドターミネータと行ターミネータを指定する」を参照してください。
互換性
BULK INSERT では、ファイルから読み取られたデータの厳密なデータ検証とデータ チェックが適用されます。これにより、既存のスクリプトが無効なデータで実行されたときに失敗する可能性があります。 たとえば、次 BULK INSERT 検証します。
- float データ型または real データ型のネイティブ表記が有効かどうか。
- Unicode データが偶数バイト長かどうか。
データ型
文字列から 10 進数へのデータ型変換
BULK INSERTで使用される文字列から 10 進数へのデータ型変換は、指数表記を使用する数値を表す文字列を拒否する Transact-SQL CONVERT 関数と同じ規則に従います。 そのため、 BULK INSERT は無効な値などの文字列を扱い、変換エラーを報告します。
この問題を回避するには、科学的表記法の float 型のデータを 10 進数の列に一括インポートするフォーマット ファイルを使用します。 フォーマット ファイルには、列のデータを明示的に real または float 型として記述します。 これらのデータ型の詳細については、 float と real を参照してください。
フォーマット ファイル real データとして、 SQLFLT4 データ型と float データとして、 SQLFLT8 データ型。 非XML形式のファイルに関する情報については、「 bcpを使ってファイルストレージタイプを指定する」をご覧ください。
科学的表記法を使用した数値をインポートする例
この例では、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 番目の列t_floatでは c2データ型が使用されるため、このデータをに直接インポートすることはできません。 そのため、フォーマット ファイルが必要です。 フォーマット ファイルでは、科学的表記法の 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 Data WarehouseはURI(例:Azure Storage)からの読み取りのみをサポートしています。
SQLXML ドキュメントの一括エクスポートまたは一括インポート用のデータ型
SQLXML データを一括エクスポートまたは一括インポートするには、フォーマット ファイルで次のいずれかのデータ型を使用します。
| データ型 | 結果 |
|---|---|
| SQLCHAR または SQLVARCHAR の を する | データは、クライアント コード ページまたは照合順序で暗黙的に指定されるコード ページで送られます。 結果は、フォーマット ファイルを指定せずに DATAFILETYPE = 'char' を指定する場合と同じです。 |
| SQLNCHAR または SQLNVARCHAR する | データは Unicode として送られます。 結果は、フォーマット ファイルを指定せずに DATAFILETYPE = 'widechar' を指定する場合と同じです。 |
| SQLBINARY または SQLVARBIN の を する | データは変換なしで送られます。 |
解説
BULK INSERT文、INSERT ... SELECT * FROM OPENROWSET(BULK...)文、bcpコマンドの比較については、「データの一括インポートおよびエクスポート」を参照してください。
一括インポート用のデータの準備については、「一括 エクスポートまたは一括インポートのためのデータの準備」を参照してください。
BULK INSERT ステートメントは、ユーザー定義トランザクション内で実行して、テーブルまたはビューにデータをインポートできます。 必要に応じて、データの一括インポートに複数の一致を使用するために、トランザクションで BATCHSIZE ステートメントで BULK INSERT 句を指定できます。 複数バッチ トランザクションがロールバックされると、SQL Server に送信されたトランザクションのすべてのバッチがロールバックされます。
相互運用性
CSV ファイルからデータをインポートします
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 プロセスのセキュリティ プロファイルに関係なく、そのユーザー アカウントでアクセス可能なファイルのみを読み取ることができます。
BULK INSERT または osql を使用して ステートメントを実行するとき、あるコンピューターから、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 Storageからインポートし、データが公開されていない(匿名アクセス)場合は、SASキーをデータベースマスターキー(DMK)で暗号化したデータベーススコープ認証情報を作成し、BULK INSERTコマンドで使用する外部データベースソースを作成します。
または、 に基づいて MANAGED IDENTITY を作成し、非パブリック ストレージ アカウントでのデータ アクセスの要求を承認します。
MANAGED IDENTITYを使用する場合、Azure Storageはインスタンスの管理IDに権限を付与し、Storage Blob Data Contributor組み込みのAzureロールベースアクセス制御(RBAC)ロールを追加し、必要なAzure Storageコンテナの管理IDへの読み書きアクセスを提供します。 Azure SQL Managed Instance には、システム割り当てマネージド ID があり、さらに 1 つ以上のユーザー割り当てマネージド ID がある場合があります。 システム割り当てマネージド ID またはユーザー割り当てマネージド ID のいずれかを使って要求を認可できます。 承認のために、マネージド インスタンスの default ID が使用されます (つまり、プライマリ ユーザー割り当てマネージド ID、またはユーザー割り当てマネージド ID が指定されていない場合はシステム割り当てマネージド ID)。 例としては、 Azure Storageのファイルからデータをインポートする項目を参照してください。
重要
マネージドアイデンティティは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オプションを使用します。
例
この記事のコード サンプルでは、AdventureWorks2025 または AdventureWorksDW2025 サンプル データベースを使用します。このサンプル データベースは、Microsoft SQL Server サンプルとコミュニティ プロジェクト ホーム ページからダウンロードできます。
重要
Azure SQL DatabaseとFabric WarehouseはAzure Storageからの読み取りのみをサポートしています。
A。 ファイルからのデータのインポートにパイプを使用する
次の例では、パイプ (AdventureWorks2022.Sales.SalesOrderDetail) をフィールド ターミネータ、| を行ターミネータとして使用し、指定のデータ ファイルから |\n テーブルに、注文の詳細情報をインポートします。
BULK INSERT AdventureWorks2022.Sales.SalesOrderDetail
FROM 'f:\orders\lineitem.tbl'
WITH (FIELDTERMINATOR = ' |', ROWTERMINATOR = ' |\n');
B. FIRE_TRIGGERS 引数を使用する
次の例では、FIRE_TRIGGERS 引数を指定します。
BULK INSERT AdventureWorks2022.Sales.SalesOrderDetail
FROM 'f:\orders\lineitem.tbl'
WITH (FIELDTERMINATOR = ' |', ROWTERMINATOR = ':\n', FIRE_TRIGGERS);
C. 行ターミネータとしてライン フィードを使用する
次の例では、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に置き換えられます。
D. コード ページを指定する
コード ページを指定する例を次に示します。
BULK INSERT MyTable
FROM 'D:\data.csv'
WITH (CODEPAGE = '65001', DATAFILETYPE = 'char', FIELDTERMINATOR = ',');
E. CSV ファイルからデータをインポートします
次の例は、; をフィールド ターミネータ、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'
);
F. Azure Storage のファイルからデータをインポート
Azure StorageのCSVからSASトークンを使ってデータをロードします
以下の例は、共有アクセス署名(SAS)を作成したAzureストレージのCSVファイルからデータを読み込む方法を示しています。 Azureストレージの場所は外部データソースとして設定されており、SASキーを使ったデータベースのスコープ認証情報が必要で、その鍵はユーザーデータベース内のDMKで暗号化されています。
注
SASトークンにリード ? がないか、 srt=o&sp=rロードすべきオブジェクトに対して少なくとも読み込み権限があり、有効期限が有効であることを確認してください(すべての日付はUTC時間です)。
(任意) DATABASE SCOPED CREDENTIAL が不要ならDMKは不要です。なぜなら、ブロブは公開(匿名)アクセスのために設定されているからです。
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>';
(任意) DATABASE SCOPED CREDENTIAL は不要です。なぜなら、ブロブは公開(匿名)アクセスのために設定されているからです。
SASトークンにリード ? を含めないでください。 ロードすべきオブジェクトに対して少なくとも読み取り権限(srt=o&sp=r)を取得し、有効期限が有効であること(すべての日付はUTC時間)であることを確認してください。
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***************';
注
CREDENTIAL Blobが公開(匿名)アクセス用に設定されている場合は必須ではありません。
CREATE EXTERNAL DATA SOURCE MyAzureBlobStorage
WITH (
TYPE = BLOB_STORAGE,
LOCATION = 'https://****************.blob.core.windows.net/invoices',
CREDENTIAL = MyAzureBlobStorageCredential
);
BULK INSERT Sales.Invoices
FROM 'inv-2017-12-08.csv'
WITH (DATA_SOURCE = 'MyAzureBlobStorage');
管理型IDでAzureストレージのCSVからデータを読み込みます
以下の例では、管理型IDを使ってAzureストレージのCSVファイルからデータを読み込むための BULK INSERT コマンドの使い方を示しています。 Azureストレージの場所は外部データソースとして設定されています。
(任意) DATABASE SCOPED CREDENTIAL が不要ならDMKは不要です。なぜなら、ブロブは公開(匿名)アクセスのために設定されているからです。
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>';
(任意) DATABASE SCOPED CREDENTIAL は不要です。なぜなら、ブロブは公開(匿名)アクセスのために設定されているからです:
CREATE DATABASE SCOPED CREDENTIAL MyAzureBlobStorageCredential
WITH IDENTITY = 'Managed Identity';
必要なAzure Storageコンテナの管理IDへの読み書きアクセスを提供するためにStorage Blob Data Contributorの役割を付与します。
注
CREDENTIAL Blobが公開(匿名)アクセス用に設定されている場合は必須ではありません。
CREATE EXTERNAL DATA SOURCE MyAzureBlobStorage
WITH (
TYPE = BLOB_STORAGE,
LOCATION = 'https://****************.blob.core.windows.net/invoices',
CREDENTIAL = MyAzureBlobStorageCredential
);
BULK INSERT Sales.Invoices
FROM 'inv-2017-12-08.csv'
WITH (DATA_SOURCE = 'MyAzureBlobStorage');
重要
マネージドアイデンティティはSQL Server 2025(17.x)以降のバージョンとAzure SQLに適用されます。
G. Azure Storageのファイルからデータをインポートし、エラーファイルを指定します
以下の例は、Azure 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 Storageにおけるデータの一括アクセスの例」をご覧ください。
その他の例
BULK INSERT のその他の例については、次の記事をご覧ください。
- XML文書の一括インポートおよびエクスポートの例
- データを一括インポートする際はアイデンティティ値を保持してください
- バルクインポート時にはnullやデフォルト値を保持してください
- フィールドおよび行の終端を指定してください
- フォーマットファイルを使ってデータを一括インポートしてください
- データのインポートやエクスポートには文字形式を使う
- ネイティブフォーマットでデータのインポートやエクスポートを行ってください
- データのインポートやエクスポートにはUnicode文字形式を使用します
- Unicodeネイティブ形式を使ってデータのインポートまたはエクスポートを行う
- フォーマットファイルを使ってテーブルの列をスキップしてください
- フォーマットファイルを使ってテーブルの列をデータファイルのフィールドにマッピングします