提问人:Tax Max 提问时间:7/11/2023 更新时间:10/12/2023 访问量:196
WAITFOR DELAY 和 PRINT 语句
WAITFOR DELAY and PRINT statement
问:
我有一个简单的while循环:
DECLARE @Counter INT
SET @Counter = 1
WHILE (@Counter <= 10)
BEGIN
PRINT 'The counter value is = ' + CONVERT(VARCHAR,@Counter) WAITFOR DELAY '00:00:01'
SET @Counter = @Counter + 1
END
我希望@counter值将以 1 秒的延迟打印出来,但相反,代码在 10 秒后执行,结果在执行结束时一次性打印出来。
The counter value is = 1
The counter value is = 2
The counter value is = 3
The counter value is = 4
The counter value is = 5
The counter value is = 6
The counter value is = 7
The counter value is = 8
The counter value is = 9
The counter value is = 10
如何确保每个下一个值都以 1 秒的延迟打印出来,以便我可以监控进度?
只是一些背景。我想使用类似的脚本来监视备份和还原进度。 例如,将进度百分比的初始值分配给:
SELECT @Counter = percent_complete
FROM sys.dm_exec_requests r
CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) a
WHERE r.command in ('BACKUP DATABASE','RESTORE DATABASE');
并每 5 秒监控一次 while 循环中的进度percent_complete直到达到 100%。
答:
除了注释中已有的建议之外,请尝试使用此修改后的脚本来演示如何使用 raiserror 来执行示例代码中预期的行为。
请记住选择“消息”(Messages) 表格以查看输出。
declare @Counter Int = 1;
while (@Counter <= 10)
begin
raiserror ('The counter value is %d', 0, 1, @Counter) with nowait;
waitfor delay '00:00:01';
set @Counter += 1;
end;
评论
SQLCMD
The counter value is 1 <...> The counter value is 10
你说
我想使用类似的脚本来监视备份和还原进度
完全不要使用此循环。只需使用 STATS
选项,您可以在其中指定百分比更改以显示更新。这是所有备份工具用来监视进度的方法。
BACKUP DATABASE
......
WITH STATS = 1;
评论
-j
[Microsoft][ODBC Driver 13 for SQL Server][SQL Server]The counter value is 1 [Microsoft][ODBC Driver 13 for SQL Server][SQL Server]The counter value is 2 [Microsoft][ODBC Driver 13 for SQL Server][SQL Server]The counter value is 3 [Microsoft][ODBC Driver 13 for SQL Server][SQL Server]The counter value is 4
如何使用 sqlcmd 在批处理文件中显示进度?中提到了一种解决方案。其他解决方案是使用 Powershell。
GO
CREATE PROCEDURE [scutility].[SqlCmdTestOutput]
AS
BEGIN
SET NOCOUNT ON;
DECLARE @count INT = 50
DECLARE @msg VARCHAR(8000)
WHILE @count > 0
BEGIN
SET @msg = convert(VARCHAR(50), sysdatetime())
RAISERROR (@msg,0,1) WITH NOWAIT
WAITFOR DELAY '00:00:10'
SET @count -= 1
END
END
若要调用此过程,请使用 Invoke-Sqlcmd。
powershell.exe -command "Invoke-Sqlcmd -ServerInstance '.' -Query '[scutility].[SqlCmdTestOutput]' -Database SCUTILITY -Verbose -QueryTimeout 0"
更多细节在这里 - https://dba.stackexchange.com/questions/222054/how-to-report-stats-on-restore-via-sqlcmd
评论
RAISERROR
(sic) 而不是 - 这样你的客户端就会立即获得状态消息。此外,完全是一个单独的语句,而不是 的修饰符。NOWAIT
WAITFOR
WAITFOR
PRINT
SELECT
PRINT
WITH STATS = 1