osql vs Invoke-Sqlcmd--重定向后者的输出

时间:2012-08-29 17:46:40

标签: sql-server powershell batch-file cmdlet osql

我们正在从调用osql的批处理文件转移到使用Invoke-Sqlcmd cmdlet的Powershell脚本。

有人知道在后一种情况下重定向输出的等效步骤是什么,在osql中使用-o标志?我们有一些后处理步骤,查看osql输出文件并相应地执行操作(如果这些日志大于X字节则报告错误)。如果Invoke-Sqlcmd可以在给出相同SQL命令的情况下复制相同的输出信息,我非常希望。

现在我的脚本中我打算拨打Invoke-Sqlcmd <...> | Out-file -filepath myLog.log。有人知道这是好还是有意义?

3 个答案:

答案 0 :(得分:1)

从cmdlet本身的文档:

Invoke-Sqlcmd -InputFile "C:\MyFolder\TestSQLCmd.sql" | Out-File -filePath "C:\MyFolder\TestSQLCmd.rpt"

以上是调用Invoke-Sqlcmd的示例,指定输入文件并将输出传递给文件。这类似于使用-i和-o选项指定sqlcmd。

http://technet.microsoft.com/en-us/library/cc281720.aspx

答案 1 :(得分:1)

我认为你会发现很难在invoke-sqlcmd中重现相同的行为。

osql和sqlcmd.exe会将T-SQL PRINT和RAISERROR以及错误发送到输出文件。

使用Powershell,您可以使用标准错误重定向技术(2&gt;&amp; 1)将标准错误重定向到标准输出:

Invoke-Sqlcmd <...>  2>&1 | Out-file -filepath myLog.log

然而,这仍然无法捕捉到一切。例如,RAIZERROR和PRINT语句仅在使用-verbose参数时在Invoke-sqlcmd中输出,如help invoke-sqlcmd中所述。在Powershell V2中,您无法重定向详细输出。虽然你可以使用 4&gt;

的Powershell V3

出于这些原因和其他原因(比如尝试在sqlcmd中重新创建所有许多不同的选项)我在我的环境中切换回使用sqlcmd.exe进行预定作业。由于不推荐使用osql.exe,我建议切换到sqlcmd.exe,它支持与osql相同的选项。

答案 2 :(得分:1)

您仍然可以从PowerShell拨打osql。我会继续这样做。 Invoke-SqlCmd返回表示结果集中每个行的对象。如果您不打算对这些对象执行任何操作,则没有理由升级到Invoke-SqlCmd