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

前端之家收集整理的这篇文章主要介绍了sql-server – 可以从命名管道/ fifo读取Sql Server BULK INSERT吗?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
BULK INSERT / bcp是否可以从命名管道读取,fifo风格?

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

例如:

>创建命名管道
>将文件解压缩到命名管道
>使用bcp或BULK INSERT从命名管道读取

要么:

>创建4个命名管道
>将1个文件拆分为4个流,将每个流写入单独的命名管道
>从4个命名管道读取4个表w / bcp或BULK INSERT

我发现的最接近的是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命名空间中的其他内容是否足够?

例如,使用Powershell的example

[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将立即重新打开命名管道,并从中传输所有数据.如果我没有第二个线程在后台准备好提供数据,sql服务器将在我的第一个线程有时间从PipeException恢复之前返回错误.

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

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

猜你在找的MsSQL相关文章