18

SQL Server 2000 クエリ アナライザで次のクエリを実行すると、次のようになります。

BULK INSERT  OurTable 
FROM 'c:\OurTable.txt' 
WITH (CODEPAGE = 'RAW', DATAFILETYPE = 'char', FIELDTERMINATOR = '\t', ROWS_PER_BATCH = 10000, TABLOCK)

40 行が OurTable のスキーマに準拠しているが、最後の 20 行の形式が変更されているテキスト ファイル (最後の 20 行のフィールドが少ないとします) では、エラーが発生します。ただし、最初の 40 行はテーブルにコミットされます。Bulk Insert を呼び出してトランザクションにならないようにする方法について何かありますか、または失敗時に強制的にロールバックするために明示的な何かを行う必要がありますか?

4

4 に答える 4

25

BULK INSERT一連の個々のINSERTステートメントとして機能するため、ジョブが失敗した場合、コミットされたすべての挿入がロールバックされるわけではありません。

ただし、トランザクション内に配置できるため、次のようなことができます。

BEGIN TRANSACTION
BEGIN TRY
BULK INSERT  OurTable 
FROM 'c:\OurTable.txt' 
WITH (CODEPAGE = 'RAW', DATAFILETYPE = 'char', FIELDTERMINATOR = '\t', 
   ROWS_PER_BATCH = 10000, TABLOCK)
COMMIT TRANSACTION
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION
END CATCH
于 2008-09-30T11:50:58.193 に答える
1

MSDN ライブラリ ( http://msdn.microsoft.com/en-us/library/ms188365(v=sql.105).aspx )BATCHSIZEの BULK INSERTの定義に記載されているとおり:

「これが失敗した場合、SQL Server はバッチごとにトランザクションをコミットまたはロールバックします...」

結論として、Bulk Insert にトランザクション性を追加する必要はありません。

于 2012-03-01T17:09:45.843 に答える
0

ユーザー定義のトランザクション内に配置して、何が起こるかを確認してください。実際には、あなたが説明したようにロールバックする必要があります。

于 2008-09-03T15:30:53.593 に答える