BULK INSERT ステートメント、INSERT ... SELECT * FROM OPENROWSET(BULK...) ステートメント、および bcp コマンドの比較については、「一括インポート操作と一括エクスポート操作について」を参照してください。
CSV データ ファイルからデータをインポートするための要件など、一括インポートのデータの準備については、「一括エクスポートまたは一括インポートのデータの準備」を参照してください。
BULK INSERT ステートメントは、ユーザー定義のトランザクション内で実行できます。ユーザー定義のトランザクションで、複数のバッチによってテーブルまたはビューにデータをインポートするために BULK INSERT ステートメントと BATCHSIZE 句を使用した場合、このトランザクションをロールバックすると、SQL Server に送信されたバッチがすべてロールバックされます。
一括インポート中に実行される行挿入操作がトランザクション ログに記録されるタイミングの詳細については、「一括インポートで最小ログ記録を行うための前提条件」を参照してください。
SQL Server 2005 以降のバージョンでは、BULK INSERT によって、ファイルから読み込んだデータに対して新しいデータ検証とデータ チェックが実行されます。これらは以前よりも厳密なため、無効なデータを使用して既存のスクリプトを実行すると、スクリプトは失敗する可能性があります。たとえば、BULK INSERT では新たに次の検証が行われます。
-
float 型と real 型のネイティブ表記が有効かどうか。
-
Unicode データが偶数バイト長かどうか。
無効なデータ形式は、以前のバージョンの SQL Server で一括インポート可能でも、現在では読み込めない場合があります。以前のバージョンの SQL Server では、クライアントが無効なデータにアクセスを試行するまで、エラーは発生しません。現在は検証機能が強化されているため、一括インポート後のデータのクエリで発生する問題を最小限に抑えられます。
パフォーマンスに関する考慮事項
1 つのバッチでフラッシュされるページの数が内部しきい値を超えると、バッチのコミット時にフラッシュするページを特定するためにバッファ プールのフル スキャンが行われる可能性があります。フル スキャンが行われると、一括インポートのパフォーマンスが低下します。この内部しきい値の問題は、大きなバッファ プールと遅い I/O サブシステムの組み合わせでも発生します。大規模なコンピュータでバッファ オーバーフローを防ぐには、TABLOCK ヒントを使用しないようにするか (一括インポートの最適化は行われなくなります)、バッチ サイズを小さくします (一括インポートの最適化は引き続き行われます)。
コンピュータはそれぞれ異なるため、実際のデータでさまざまなバッチ サイズを試して最適な値を見つけるようにすることをお勧めします。
SQLXML ドキュメントの一括エクスポートまたは一括インポート
SQLXML データを一括エクスポートまたは一括インポートするには、フォーマット ファイルで次のいずれかのデータ型を使用します。
|
データ型
|
結果
|
|---|
|
SQLCHAR または SQLVARYCHAR
|
データは、クライアント コード ページまたは照合順序で暗黙的に指定されるコード ページで送られます。フォーマット ファイルを指定せずに DATAFILETYPE = 'char' を指定した場合と同じ結果が得られます。
|
|
SQLNCHAR または SQLNVARCHAR
|
データは Unicode として送られます。フォーマット ファイルを指定せずに DATAFILETYPE = 'widechar' を指定した場合と同じ結果が得られます。
|
|
SQLBINARY または SQLVARYBIN
|
データは変換なしで送られます。
|
文字列から 10 進数への型変換
SQL Server 2005 以降のバージョンでは、BULK INSERT で実行される文字列から 10 進数への型変換には、Transact-SQL の CONVERT 関数と同じ規則が適用されるので、科学的表記法を使用した数値を表す文字列は拒否されます。したがって、BULK INSERT を実行するときに、そのような文字列が無効な値として評価され、変換エラーが報告されます。
メモ : |
|---|
|
SQL Server Version 7.0 および SQL Server 2000 の BULK INSERT では、科学的表記法を使用する数値を表す文字列に対して、文字列から 10 進数への型変換がサポートされます。
|
この問題を回避するには、科学的表記法の float 型のデータを 10 進数の列に一括インポートするフォーマット ファイルを使用します。フォーマット ファイルには、列のデータを明示的に real または float 型として記述します。これらのデータ型の詳細については、「float 型と real 型 (Transact-SQL)」を参照してください。
科学的表記法を使用した数値をインポートする例
この例では、次のテーブルを使用します。
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="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..t_float
FROM 'C:\t_float-c.dat' WITH (FORMATFILE='C:\t_floatformat-c-xml.xml');
GO