9

BULK INSERT/bcp がfifoスタイルの名前付きパイプから読み取ることは可能ですか?

つまり、実際のテキスト ファイルから読み取るのではなく、別のプロセスの書き込み側にある名前付きパイプから BULK INSERT/bcp を読み取らせることができますか?

例えば:

  1. 名前付きパイプを作成する
  2. ファイルを名前付きパイプに解凍します
  3. bcp または BULK INSERT を使用して名前付きパイプから読み取る

また:

  1. 4 つの名前付きパイプを作成する
  2. 1 つのファイルを 4 つのストリームに分割し、各ストリームを個別の名前付きパイプに書き込みます
  3. bcp または BULK INSERT を使用して、4 つの名前付きパイプから 4 つのテーブルに読み込む

私が見つけた最も近いのは、この仲間(サイトには現在アクセスできません) で、 bcp を使用して名前付きパイプに書き込むことができました。彼自身のユーティリティと使用方法は次のとおりです。

start /MIN ZipPipe authors_pipe authors.txt.gz 9
bcp  pubs..authors out  \\.\pipe\authors_pipe -T -n

しかし、彼はその逆を機能させることができませんでした。

したがって、愚か者の用事を始める前に、BULK INSERT または bcp を使用して名前付きパイプから読み取ることが基本的に可能かどうか疑問に思っています。また、可能であれば、どのように設定しますか? NamedPipeServerStream.NETSystem.IO.Pipes名前空間の他のものが適切でしょうか?

たとえば、Powershell を使用した例:

[reflection.Assembly]::LoadWithPartialName("system.core")
$pipe = New-Object system.IO.Pipes.NamedPipeServerStream("Bob")

そして……なに?

4

4 に答える 4

5

Windows 7 および SQL Server 2008R2 で名前付きパイプを使用して BULK INSERT (BCP ではなく) を正しく動作させることに成功しました。いくつかのトリックがあります。

まず、 2 つの異なるスレッド上に、同じパイプ名を持つ 2つの名前付きパイプ インスタンスを作成する必要がありました。SQL Server は最初のインスタンスを開き、そこから数バイトを読み取って閉じます。これにより、WriteFile は最初のスレッドで PipeException を発生させます。SQL Server はすぐに名前付きパイプを再度開き、そこからすべてのデータをストリーミングします。バックグラウンドでデータを処理する準備が整った 2 番目のスレッドがなければ、最初のスレッドが PipeException から回復する前に、SQL サーバーがエラーを返します。

次に、WriteFile への 1 回の呼び出しですべてのデータを書き込む必要がありました。複数のバッチをパイプに書き込むループから始めましたが、BULK INSERT は最初に書き込んだバッチのみを使用しました。非ブロッキング読み取りを行うようで、ゼロバイトを返す読み取りをファイルの終わりとして扱います。

第 3 に、XML 形式のファイルを使用する場合は、通常のファイルに書き込む必要があります。SQL Server にパイプからフォーマット ファイルを読み取らせることに成功していません。非 XML 形式のファイルをパイプから読み取れるかどうかはわかりません。

于 2013-07-08T19:24:42.217 に答える
5

残念ながら、SSIS フラット ファイル アダプターである BULK INSERT と BCP はどちらも、ファイルに対して排他的な書き込みロックを取得します (実際には書き込みは行いません)。これが機能しない理由です。

重大なハッキングなしに、同じパイプで2つの排他的ロックを許可するようにパイプを設定できるかどうかはわかりません。あなたはそれを迂回するか、fltmgr.sysにハッキングすることができます:)

他の投稿者が示唆したように、.NET API を使用して一括処理を行うか、OLEDB または ODBC インターフェイスを代わりに使用する方が簡単ですが、独自のファイル パーサーを作成する必要があります。

于 2012-06-14T22:24:00.513 に答える
-1

BCP受け入れSTDINますか?その場合は、名前付きパイプを作成せずに、パイプをまっすぐに通してみてください...たとえば、次のようになります。

gunzip authors.txt.gz | bcp schema.tablename
于 2013-02-12T00:19:50.690 に答える