【问题标题】:osql vs Invoke-Sqlcmd-- redirecting output of the latterosql vs Invoke-Sqlcmd--重定向后者的输出
【发布时间】:2012-08-29 17:46:40
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案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

    【讨论】:

    • 谢谢,但 osql 是否遵循与 sqlcmd 相同的模式?我问是因为在我的 powershell 脚本中,我已经将 osql -o 换成了 Invoke-Sqlcmd Out-File 位,并且生成的输出文件(相同的 SQL 命令)是不同的。 osql 版本似乎只输出错误,而 Invoke-Sqlcmd 返回类似于 SELECT 语句结果的信息。
    【解决方案2】:

    我认为您会发现很难在 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 中,您不能重定向详细输出。虽然您可以使用 4>

    使用 Powershell V3

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-12-17
        • 1970-01-01
        • 1970-01-01
        • 2019-06-21
        • 1970-01-01
        • 1970-01-01
        • 2015-07-31
        相关资源
        最近更新 更多