Создание именованного канала в Windows
Я хочу написать большой набор данных из базы данных SQL Server 2005, используя BCP (программу массового копирования).
В идеале я хотел бы сделать следующее:
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 крайней мере,
3 ответа
В Unix вы можете использовать mkfifo для такого рода вещей, но, насколько я знаю, нет инструмента командной строки Windows для создания именованных каналов или манипулирования ими. Они недоступны для инструментов командной строки, как обычные и UNC-пути.
Вы можете создать именованный канал в Perl, используя Win32::Pipe, если вы достаточно хорошо знаете Perl. И вы могли бы написать Perl-клиент, который будет извлекать данные из канала и отправлять их в STDOUT, но в Windows это действительно невозможно сделать элегантно.
Я просто искал то же самое!
Этот парень, кажется, выполнил bcp to gzip с фоновой работой:
http://jcarlossaez.spaces.live.com/blog/cns!B3378F057444B65C!108.entry
Я сомневаюсь, что вы можете сделать это, или даже заставить его работать. Но не проще ли сделать это в два этапа?
bcp MyDatabase..MyTable OUT c:\temp\dataset.csv -c -t,
gzip c:\temp\dataset.csv