Назад | Перейти на главную страницу

Возникли проблемы с конвейером между cygwin и sqlcmd

Эта простая команда не работает в bash:

echo "print 'tsql'" | sqlcmd -E

он правильно работает в обычной старой командной строке.

Раньше он работал с предыдущими версиями cygwin. Я также пробовал вставлять туда различные варианты unix2dos и смотрел на вывод с помощью «od -c». Так что я совершенно уверен, что это не просто проблема LF vs. CR / LF.

Глядя на эту ветку: http://cygwin.com/ml/cygwin/2010-01/msg00205.html

заставляет меня поверить, что в cygwin что-то сломалось, но я не смог найти больше зацепок.

Есть ли у кого-нибудь какие-либо подсказки, кроме создания временного файла, а затем использования

sqlcmd -E -i tempfile

который работает, но уродливо.

Я использую MSYS2 (x86-64, установлен с 20150916 и обновлен с помощью pacman до последних пакетов по умолчанию по состоянию на два дня назад), но в итоге я столкнулся с той же ошибкой (что имеет смысл, поскольку MSYS2 является производной от cygwin). У меня никогда не было этого с MSYS, но поскольку MSYS вроде как мертв, и мне нужны более современные инструменты, я переключаюсь на MSYS2 и портирую свои скрипты. Я нашел обходной путь, который у меня работает в данный момент:

$ echo hi | cmd //c "cat | sqlcmd"

Я полагаю, это работает, потому что мы просим cmd чтобы установить канал между процессом MSYS2 (cat) и процесс Windows, а не позволять MSYS2 /bash сделай это. Хотя я также подозреваю, что SQLCMD проделывает некую злобную мерзкую уловку из-за программирования Windows в 90-х, чего ему не следовало делать в первую очередь, что делает его особым случаем, который, возможно, заслуживает разработки в cygwin / MSYS2.

Обратите внимание, что с помощью этого метода, передавая аргументы в sqlcmd становится действительно сложно, особенно если вы хотите передать буквальный ".

Полный вывод от меня, демонстрирующий ошибку, ее решение и показывающий, где sqlcmd исходит из:

ohnob@WIN-F5A6PNAUAJ2  ~
$ echo hi |sqlcmd -S localhost\\SQLEXPRESS12
Sqlcmd: Error: Internal error at ReadTextLine (Reason: Unspecified error).

ohnob@WIN-F5A6PNAUAJ2  ~
$ echo hi | cmd //c "cat | sqlcmd -S localhost\\SQLEXPRESS12"
Msg 2812, Level 16, State 62, Server WIN-F5A6PNAUAJ2\SQLEXPRESS12, Line 1
Could not find stored procedure 'hi'.

ohnob@WIN-F5A6PNAUAJ2  ~
$ which sqlcmd
/c/Program Files/Microsoft SQL Server/Client SDK/ODBC/110/Tools/Binn/sqlcmd

ohnob@WIN-F5A6PNAUAJ2  ~
$ WHERE cat | head -n 1
C:\msys64\usr\bin\cat.exe

У меня были аналогичные проблемы с SQLCMD в Bash, и на данный момент этот вопрос занимает третье место при поиске sqlcmd cygwin в Google. Я тоже думал, что это связано с окончанием строки из-за ошибки,

Sqlcmd: Error: Internal error at ReadTextLine (Reason: Unspecified error).

Я пробовал различные уловки, такие как подмена процесса, но это не сработало. Лучшее, что я мог придумать, это использовать

sqlcmd -Q "print 'tsql'"