在Windows上创建命名管道


6

我想使用BCP(批量复制程序)从SQL Server 2005数据库编写大型数据集。

理想情况下,我想做以下事情:

bcp MyDatabase..MyTable OUT STDOUT -c -t, |gzip -c c:\temp\dataset.csv.gz

但是,BCP只是将其写入名为STDOUT的文字文件中。

我也尝试过:

bcp MyDatabase..MyTable OUT CON: -c -t, |gzip -c c:\temp\dataset.csv.gz

但这会返回和错误 Error = [Microsoft][SQL Native Client]Unable to open BCP host data-file

那么,我可以在任何地方创建命名管道吗?我已经在网上看到了以某种方式启动的提示 gzip 一端绑定到文件名,如\\。\ named_pipe - 但这是怎么做到的?

更新 :请注意,Microsoft自己承认他们真的不关心SQL Server的效率: http://connect.microsoft.com/SQLServer/feedback/details/337702/support-bcp-out-in-and-bulk-insert-compressed-or-named-pipe-support-at-least


1
为什么微软世界中最简单的事情几乎是不可能的。
PP.

1
因为来自“大多数最终用户客户群”,这不是“我想做的简单事情列表”。 Windows有不同的优先级。它显然做了一些正确的事情,在Linux上如此大的推动,以改善它的GUI以赶上Windows ...顺便说一句,我是一个很长时间的Linux用户,我讨厌Windows
Dan McGrath

Answers:


1

在Unix上你可以使用 mkfifo 对于这类事情,但据我所知,没有Windows命令行工具来创建或操作命名管道。它们不像传统和UNC路径那样可以被命令行工具访问。

如果你足够了解Perl,你可以使用Win32 :: Pipe在Perl中创建一个命名管道。你可以编写一个Perl客户端来将数据从管道中取出并发送到STDOUT,但这在Windows中实际上不能很好地完成。


1

我怀疑你能做到这一点,甚至让它发挥作用。但是,分两步做这件事会不会更简单?

bcp MyDatabase..MyTable OUT c:\temp\dataset.csv -c -t,
gzip c:\temp\dataset.csv

1
是的,它会更容易,但也有可能占用过多的本地磁盘空间,并且不必要地写入和重新读取数据。这是一件低效的事情。
PP.

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.