也就是说,不是从实际文本文件中读取,而是可以使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")
然后什么?
解决方法
首先,我必须在两个不同的线程上创建两个命名管道实例,两个线程具有相同的管道名称. sql Server将打开第一个实例,从中读取几个字节并关闭它,导致WriteFile在第一个线程中引发PipeException.然后,sql Server将立即重新打开命名管道,并从中传输所有数据.如果我没有第二个线程在后台准备好提供数据,sql服务器将在我的第一个线程有时间从PipeException恢复之前返回错误.
其次,我必须在一次调用WriteFile时编写所有数据.我从一个循环开始,我在管道中写了多个批次,但是BULK INSERT只使用了我写的第一批.它似乎执行非阻塞读取,并将任何返回零字节的读取视为文件结尾.
第三,必须将XML格式文件(如果使用)写入常规文件.我没有成功让sql Server从管道读取格式文件.我不知道它是否可以从管道中读取非XML格式的文件.