对于这样的问题,我没有看到确切或类似的有用答案,所以我问自己。
我在Powershell ISE中使用2行来运行我编写的两个非常简单的SQL脚本。我正在测试如何在SQL中使用WAITFOR DELAY命令来运行一个SQL脚本。然后等待一定时间,然后再运行第二个SQL脚本。
在我的第一个SQL脚本中,我有一个简单的GETDATE()命令,该命令在WAITFOR DELAY命令之前运行。 在第二个SQL脚本中,我具有相同的GETDATE()命令。然后,Powershell ISE使用“ Out-File”将这两个脚本写入一个.txt文件,因此我可以看到它是否符合我在第一个SQL脚本中插入WAITFOR DELAY的时间限制。
为避免该错误,我有些麻烦:“ Invoke-Sqlcmd:执行超时已到期。在操作完成之前超时时间已过,或者服务器未响应。” … 但是,通过在SELECT GETDATE()和WAITFOR DELAY命令之间放置一个“ go”关键字,我成功地获得了“ 00:01:00”的WAITFOR DELAY的工作。但是现在,我正在尝试制作我的脚本等待 ANY 超过1分钟。.我遇到了上面提到的相同错误。即使超过1分钟1秒也不会注册到我的文本文件中输入的数据中。
我的目标是获取第一个文本文件来注册GETDATE()..的时间,然后让powershell等待10分钟,然后再执行第二个带有GETDATE()的SQL脚本,以便能够看到10分钟的差异。在两个脚本的执行之间。
有人可以帮助我实现这一目标吗?
谢谢。
答案 0 :(得分:2)
如果您正在使用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以及已接受答案中的两个链接问题。特别是,我同意这样的评估,即冷查询性能不应该那么重要,因为从某种意义上说,它并不经常运行。
答案 1 :(得分:0)
对于将来遇到相同问题的读者。.
之后,您必须使用-QueryTimeout 0 恰好Invoke-Sqlcmd -InputFile'__。sql'___________…
使其正常工作。在其他任何地方都无法使用。