【问题标题】:PowerShell with SQL Server Management Studio WAITFOR DELAY commandPowerShell 与 SQL Server Management Studio WAITFOR DELAY 命令
【发布时间】:2018-11-19 14:10:52
【问题描述】:

我没有看到对此类问题的确切或任何类似有用的答案,所以我问自己。

我在 Powershell ISE 中使用 2 行代码来运行我编写的两个非常简单的 SQL 脚本。我正在测试如何在 SQL 中使用 WAITFOR DELAY 命令来运行一个 SQL 脚本。然后在运行第二个 SQL 脚本之前等待一段时间。

在我的第一个 SQL 脚本中,我有一个简单的 GETDATE() 命令,该命令在 WAITFOR DELAY 命令之前运行。 在我的第二个 SQL 脚本中,我有相同的 GETDATE() 命令。然后 Powershell ISE 使用“Out-File”将这 2 个脚本写入 .txt 文件,以便我可以查看它是否符合我在第一个 SQL 脚本中插入 WAITFOR DELAY 的时间限制。

我在避免错误时遇到了一些麻烦:“Invoke-Sqlcmd: Execution Timeout Expired。在操作完成之前超时时间已过或服务器没有响应。” … 但是,我只需在我的 SELECT GETDATE() 和我的 WAITFOR DELAY 命令之间放置一个“go”关键字,就成功地让“00:01:00”的 WAITFOR DELAY 工作。但现在我正试图让我的脚本等待 ANY 超过 1 分钟。我收到与上面提到的相同的错误。即使比 1 分钟长 1 秒也不会注册到输入到我的文本文件中的数据中。

我的目标是让第一个文本文件注册 GETDATE() 的时间.. 然后让 powershell 等待 10 分钟,然后执行第二个 SQL 脚本,其中包含 GETDATE() .. 能够看到 10 分钟的差异在两个脚本的执行之间。

谁能帮我解决这个问题?

提前致谢。

【问题讨论】:

  • 您是否尝试过将 QueryTimeout 与 invoke-sqlcmd 一起使用? docs.microsoft.com/en-us/powershell/module/sqlserver/…
  • 我需要等待延迟,因为我需要第一个 T-sql 脚本在运行第二个 sql 脚本之前工作 10 分钟。 Powershell sleep 在我的调用之间造成了 10 分钟的延迟,这不是我需要的帮助......
  • 我尝试使用你们关于 Invoke-Sqlcmd -QueryTimeout 10 的建议……但它同时运行第一个和第二个 sql 脚本

标签: sql-server powershell


【解决方案1】:

如果您使用 PowerShell 库中的 SqlServer module 中的 Invoke-Sqlcmd,您应该能够指定 -QueryTimeout 参数,该参数允许您指定最长 65535 秒(约 18 小时)的超时。我不确定这是什么时候添加的,但我知道它在 SQL Server 2008 R2 的 SQLPS 模块/管理单元中丢失了。

如果这不起作用,您需要使用 .Net SqlClient 类编写您自己的版本。问题在于它不理解 GO 批处理分隔符,因为那不是 T-SQL。

请记住,数据库本身可能有自己的查询超时。

另外,如果您只想等待 10 分钟,那么这样做就足够了:

Invoke-Sqlcmd ...
Start-Sleep -Seconds 600
Invoke-Sqlcmd ...

最后,如果您要测试性能,请记住,这种类型的测试会产生非常多变的结果。如果您的 SQL Server 不需要使用内存,那么您的查询很可能会在缓存池中保留 10 分钟(或更长时间)。

例如,如果您尝试确定冷查询性能,这不是最佳方法。您需要使用 DBCC 命令强制服务器忽略它自己的缓存或使其缓存无效。我会通读this question 以及已接受答案中的两个相关问题。特别是我同意冷查询性能不应该是什么大问题的评估,因为从某种意义上说,它并不经常运行。

【讨论】:

  • 我尝试使用你们关于 Invoke-Sqlcmd -QueryTimeout 10 的建议……但它同时运行第一个和第二个 sql 脚本
  • @Dan -QueryTimeout 并没有消除对WAITFOR DELAY 的需求。它只是允许您避免遇到的超时错误。 -QueryTimeout 10 也是 10 秒超时。 10 分钟需要 600 秒。但是,您可能仍会遇到超时问题,因为 the default server-side query timeout is 10 minutes.
【解决方案2】:

对于有同样问题的未来读者..您必须在您的

之后使用 -QueryTimeout 0 恰好

Invoke-Sqlcmd -InputFile '__.sql' ___________ ...

让它工作。它不会在其他任何地方工作。

【讨论】:

    猜你喜欢
    • 2014-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-01
    • 2013-11-21
    • 1970-01-01
    • 2011-01-02
    • 1970-01-01
    相关资源
    最近更新 更多