Эта простая команда не работает в 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'"