我们正在从调用osql的批处理文件转移到使用Invoke-Sqlcmd cmdlet的Powershell脚本。
有人知道在后一种情况下重定向输出的等效步骤是什么,在osql中使用-o标志?我们有一些后处理步骤,查看osql输出文件并相应地执行操作(如果这些日志大于X字节则报告错误)。如果Invoke-Sqlcmd可以在给出相同SQL命令的情况下复制相同的输出信息,我非常希望。
现在我的脚本中我打算拨打Invoke-Sqlcmd <...> | Out-file -filepath myLog.log
。有人知道这是好还是有意义?
答案 0 :(得分:1)
从cmdlet本身的文档:
Invoke-Sqlcmd -InputFile "C:\MyFolder\TestSQLCmd.sql" | Out-File -filePath "C:\MyFolder\TestSQLCmd.rpt"
以上是调用Invoke-Sqlcmd的示例,指定输入文件并将输出传递给文件。这类似于使用-i和-o选项指定sqlcmd。
答案 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
。