1

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

有谁知道在后一种情况下将输出重定向到在 osql 中使用 -o 标志的等效步骤是什么?我们有一些后处理步骤来查看 osql 输出文件并采取相应措施(如果这些日志大于 X 字节,则报告错误)。如果 Invoke-Sqlcmd 可以在输入相同的 SQL 命令的情况下复制相同的输出信息,我将非常喜欢它。

现在在我的脚本中,我打算调用Invoke-Sqlcmd <...> | Out-file -filepath myLog.log. 有谁知道这是否可行或有意义?

4

3 回答 3

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

于 2012-08-29T17:52:07.263 回答
1

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

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

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

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

然而,这仍然不会抓住一切。例如,RAISERROR 和 PRINT 语句仅在使用 -verbose 参数时才在 Invoke-sqlcmd 中输出,如帮助 invoke-sqlcmd 中所述。在 Powershell V2 中,您不能重定向详细输出。虽然您可以使用 Powershell V3 使用4>

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

于 2012-08-30T01:07:21.257 回答
1

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

于 2012-09-04T01:44:48.593 回答