我有一个运行了几天的 while 循环(按设计),请参阅相关文件是否有限制可以将多少备份附加到单个文件?
我有一个显示循环计数的局部变量,当我在查询窗口中运行它时,我可以显示计数print @counter
我现在正在作业中运行 while 循环,我想显示该@counter
值。经过一些研究,我尝试了RAISERROR (Transact-SQL),它应该显示在 SQL 错误日志中,但它不起作用。我阅读了Using RAISERROR我认为我的代码是正确的,但不确定它是否可以在带有局部变量的 While 循环中使用。
创建数据库并准备它
USE [master]
GO
Create database T_test
USE [master]
GO
ALTER DATABASE [T_test] SET RECOVERY FULL WITH NO_WAIT
GO
BACKUP DATABASE T_test to disk= N'K:\Test\T_test.bak' with noinit --Create first full
GO
尝试在查询窗口中运行以测试
DECLARE @counter int
SET @counter = 0
WHILE 1=1
BEGIN
BACKUP DATABASE [T_test] TO
DISK = N'K:\Test\T_Test.diff' WITH DIFFERENTIAL , NOFORMAT, NOINIT,
NAME = N'T_Test-Diff Database Backup', SKIP, NOREWIND, NOUNLOAD, COMPRESSION
SET @counter = @counter + 1;
RAISERROR(N'Count equals :%d', 16, 1, @counter );
print @counter
END
在几个循环后停止并检查 SQL 日志和查询消息
错误不在 SQL 日志中,但显示在查询消息中。
我认为您不能GO 5000000
与局部变量一起使用,至少在我的尝试中,它每次重新声明时都会重置。
如何在while循环中实时显示局部变量?
RAISERROR有两个扩展可能会有所帮助:
要将其写入错误日志:
要“实时”在消息选项卡中显示它:
您可以将值写入表。就像是
您可以在需要查看进度时查询此表。
如果您不想用它污染生产数据库,可以在 TempDB 中创建它。注意我不是说创建一个
#temp
表。这仅对备份作业可见。我的意思是“真实”表,但在 tempdb 中。它会在实例重新启动时被删除,因此必须实施适当的管理例程。