我想使用 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
从一端开始,绑定到文件名,如 \\.\命名管道- 但这是怎样做到的呢?
更新:请注意,微软自己也承认他们确实不关心 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
在 Unix 上你可以使用先入先出这类事情,但据我所知,没有 Windows 命令行工具可以创建或操作命名管道。它们无法像常规和 UNC 路径那样被命令行工具访问。
如果您对 Perl 足够了解,可以使用 Win32::Pipe 在 Perl 中创建命名管道。您可以编写 Perl 客户端从管道中提取数据并将其发送到 STDOUT,但这在 Windows 中确实无法完美地完成。
答案2
我刚刚在寻找同样的东西!
这家伙似乎已经通过后台作业完成了 bcp 到 gzip 的操作:
http://jcarlossaez.spaces.live.com/blog/cns!B3378F057444B65C!108.entry
答案3
我怀疑你能做到,甚至不能让它发挥作用。但分两步做不是更简单吗?
bcp MyDatabase..MyTable OUT c:\temp\dataset.csv -c -t,
gzip c:\temp\dataset.csv