这个简单的命令在 bash 中失败:
echo "print 'tsql'" | sqlcmd -E
它在常规的旧命令提示符下可以正常工作。
它曾经与以前版本的 cygwin 配合使用。我还尝试在其中插入各种版本的 unix2dos,并使用“od -c”查看了输出。所以我很确定这不仅仅是 LF 与 CR/LF 的问题。
看看这个帖子: http://cygwin.com/ml/cygwin/2010-01/msg00205.html
这让我相信 cygwin 中出现了问题,但我无法找到更多线索。
除了生成临时文件然后使用之外,还有什么线索吗?
sqlcmd -E -i tempfile
虽然它可以工作,但是很丑。
答案1
我正在使用 MSYS2(x86-64,使用 20150916 安装并使用pacman
两天前更新到最新的默认软件包),但最终遇到了相同的错误(这是有道理的,因为 MSYS2 是 cygwin 的衍生产品)。我使用 MSYS 时从未遇到过这种情况,但由于 MSYS 已经过时,而且我想要更多现代工具,因此我切换到 MSYS2 并移植我的脚本。我找到了一种目前对我有用的解决方法:
$ echo hi | cmd //c "cat | sqlcmd"
我认为它之所以有效是因为我们要求cmd
在 MSYS2 进程 ( ) 和 Windows 进程之间建立管道,cat
而不是让 MSYS2/bash
来做这件事。不过我也怀疑这SQLCMD
是在做一些来自 90 年代 Windows 编程的邪恶的卑鄙伎俩,它本来就不应该这样做,这使它成为一个特殊情况,也许值得在 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
答案2
我在 Bash 中使用 SQLCMD 时也遇到了类似的问题,目前这个问题sqlcmd cygwin
在 Google 上搜索时排名第三。我也认为这是由于行尾错误造成的,
Sqlcmd: Error: Internal error at ReadTextLine (Reason: Unspecified error).
我尝试了各种技巧,比如进程替换,但都没有用。我能想到的最好的办法是使用
sqlcmd -Q "print 'tsql'"