gpt4 book ai didi

sql-server - Sql Server BULK INSERT 可以从命名管道/fifo 读取吗?

转载 作者:行者123 更新时间:2023-12-02 22:23:13 25 4
gpt4 key购买 nike

BULK INSERT/bcp 是否可以从命名管道读取 fifo -风格?

也就是说,是否可以使 BULK INSERT/bcp 从位于另一个进程的写入端的命名管道中读取,而不是从真实的文本文件中读取?

例如:

  1. 创建命名管道
  2. 将文件解压到命名管道
  3. 使用 bcp 或 BULK INSERT 从命名管道读取

或者:

  1. 创建 4 个命名管道
  2. 将 1 个文件拆分为 4 个流,将每个流写入单独的命名管道
  3. 使用 bcp 或 BULK INSERT 从 4 个命名管道读取到 4 个表

我发现的最接近的是 this fellow (站点现在无法访问),他设法使用 bcp 写入命名管道,使用他自己的实用程序和用法,如下所示:

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

但他无法让相反的事情发挥作用。

因此,在我开始愚蠢的差事之前,我想知道是否从根本上可以从带有 BULK INSERT 或 bcp 的命名管道中读取数据。如果可能的话,我们会如何设置呢? NamedPipeServerStream 或 .NET System.IO.Pipes 命名空间中的其他内容是否足够?

例如,example使用 Powershell:

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

然后......什么?

最佳答案

我已成功使 BULK INSERT(但不是 BCP)在 Windows 7 和 SQL Server 2008R2 上的命名管道上正常工作。有一些技巧。

首先,我必须在两个不同的线程上创建两个命名管道实例,它们都具有相同的管道名称。 SQL Server 将打开第一个实例,从中读取几个字节,然后关闭它,从而导致 WriteFile 在第一个线程中引发 PipeException。然后,SQL Server 将立即重新打开命名管道,并流入其中的所有数据。如果我没有在后台有第二个线程准备好提供数据,那么在我的第一个线程有时间从 PipeException 中恢复之前,SQL Server 将返回一个错误。

其次,我必须在一次调用 WriteFile 中写入所有数据。我从一个循环开始,将多个批处理写入管道,但 BULK INSERT 仅使用我写入的第一批。它似乎执行非阻塞读取,并将任何返回零字节的读取视为文件结尾。

第三,如果使用XML格式文件,则必须将其写入常规文件。我没有成功让 SQL Server 从管道读取格式文件。我不知道它是否可以从管道读取非 XML 格式的文件。

关于sql-server - Sql Server BULK INSERT 可以从命名管道/fifo 读取吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2197017/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com