1

しようとすると

BULK INSERT table FROM 'c:\file.txt'

私は得る

Msg 4861, Level 16, State 1, Line 1
Cannot bulk load because the file "c:\file.txt" could not be opened. Operating system error code 32(The process cannot access the file because it is being used by another process.).

ファイルは別のプロセスによって開かれたログ ファイルであるため、エラーが発生しました。

ただし、C# を使用すると、次のようにファイルを開くことができますSystem.IO.FileShare.ReadWrite

using (System.IO.FileStream fileStream = new System.IO.FileStream("c:\\file.txt", System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.ReadWrite))
        {
            using (System.IO.StreamReader streamReader = new System.IO.StreamReader(fileStream))
            {
                file = streamReader.ReadToEnd();
            }
        }

その ReadWrite が SQL Server 内で機能を共有する方法はありますか (一括挿入またはその他)?

ありがとう

4

2 に答える 2

2

SQL Server がバックグラウンドで使用する OpenFile フラグを制御できないため、一括挿入を行う前にファイルを一時ファイルにコピーする必要がある場合があります。

于 2013-03-06T23:31:44.687 に答える
1

(質問を削除したため、DBA.SEの私の回答から再投稿しました。)

BULK INSERT読み取りが行われている間、他のプロセスがファイルを同時に変更していないことを確認するために、ソース ファイルの書き込みロックを取得しようとします。これは、ファイル形式を安定させるために行われます。これは、読み取りが、並行ライターによって書き込まれている部分的な行を処理しようとする可能性があるためです。

ログ ファイルは既に別のプロセスによって書き込み用に開かれているため、これは互換性のないアクセスであり、そのエラーが発生します。

コードについて:

  • FileAccessファイルで何をするかを決定します。
  • FileShareファイルを開いているときに、他のユーザーがそのファイルに対して実行できる操作を決定します。

ロギング プロセスはFileAccess.Writeorを使用FileAccess.ReadWriteし、コードが成功した場合、おそらく、FileShare.Read他のユーザーがファイルに同時に書き込むことはできなくなりますが、内容を読み取ることはできます。コードは読み取りアクセスのみを要求するため、これは互換性があります。コードを再実行して書き込みアクセスを要求すると ( FileAccess.Write)、コードは失敗します。

BULK INSERTこのファイルのインポートに使用するには、コピーを作成してインポートする必要があります。そうすれば、ファイルのロックは発生しません。

于 2013-03-07T17:39:45.467 に答える