分离 sql​​cmd 的标准输出和标准错误

Separating sqlcmd's stdout and stderr

我需要在 Linux 上使用 sqlcmd 为 Azure SQL 数据仓库实施测试工具。在我的测试中,我想捕获 sqlcmd 遇到的任何错误消息,但将查询结果发送到 /dev/null(使用 -o 参数)。复习中https://msdn.microsoft.com/en-us/library/ms162773.aspx,好像用了-o,-r1就没有意义了

 -r[0 | 1]
    Redirects the error message output to the screen (stderr). If you do not specify a parameter or if you specify 0, only error messages that have a  severity level of 11 or higher are redirected. If you specify 1, all error message output including PRINT is redirected. Has no effect if you use -o. By default, messages are sent to stdout.

无法理解为什么 stdout 和 stderr 会以这种方式混合在一起。

在将 "stdout+stderr" 写入命名管道然后从命名管道的结果中删除错误消息时,我只能在后台求助于 运行 sqlcmd 吗?

我不想在写入输出时造成任何延迟,但确实希望 return 向客户提供完整的结果。

"sqlcmd -i debug_dir/test2.sql -r1 2> /tmp/2.out 1> /tmp/1.out"对你有用吗?

我在本地盒子上试过了:

$> 猫 debug_dir/test2.sql

select * 来自测试 1; 去

select * 来自 test1,其中 i = 'a'; 去

select * 来自测试 2; 去

$> sqlcmd -S XXX -N -U YYY -P ZZZ -d AAA -I -i debug_dir/test2.sql -r1 2> [=43= .out 1> /tmp/1.out

$> 猫 /tmp/1.out 我j k


      2           1           3
      1           2           3
      2           1           4

(3 行受影响) a b c


      2           1           4
     11          12           4
     11          12           3
      2           1           3

$> 猫 /tmp/2.out 消息 245,级别 16,状态 1,服务器 XXX,第 1 行 将 varchar 值 'a' 转换为数据类型 int 时转换失败。 消息 104309,级别 16,状态 1,服务器 XXX,第 1 行 输入脚本中没有批次。

您可以重定向到 /dev/null 而不是 /tmp/1.out

希望对您有所帮助。