在 cygwin 和 sqlcmd 之间进行管道传输时遇到问题

在 cygwin 和 sqlcmd 之间进行管道传输时遇到问题

这个简单的命令在 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'"

相关内容