如何仅在良好的情况下恢复 .bak

DnL*_*DnL 2 sql-server-2008 sql-server t-sql sql-server-2008-r2 sql-server-2014

我正在使用 Tsql 脚本来恢复多个数据库。

RESTORE DATABASE XXX_M
   FROM DISK = 'C:\XXX.bak'
   WITH FILE = 1, replace
GO
Run Code Online (Sandbox Code Playgroud)

有时 .bak 文件已损坏(不是数据损坏)。

我想知道是否有一种方法可以检查文件是否未损坏,然后进行恢复,否则不会。我尝试在恢复验证后使用@@rowcount,但效果不好。

RESTORE VERIFYONLY 
   FROM DISK = 'C:\xxx.bak'
if @@ROWCOUNT !=0
print 'false'
else 
print 'good'
Run Code Online (Sandbox Code Playgroud)

还有其他想法吗?

谢谢。

Aar*_*and 6

检查@@ROWCOUNT在这里没有价值,因为RESTORE VERIFONLY不会返回任何结果。它打印状态消息或错误消息。所以,一个简单的TRY/CATCH应该做:

BEGIN TRY
  RESTORE VERIFYONLY ...
  RESTORE DATABASE   ...
END TRY
BEGIN CATCH
  PRINT ERROR_MESSAGE();
END CATCH
Run Code Online (Sandbox Code Playgroud)

如果VERIFYONLY失败,它将引发异常,并跳过RESTORE.

当然,仍然存在VERIFYONLY会成功但会RESTORE失败的情况(例如,某些东西突然进入并占用了您的所有磁盘空间)。