SQL 服务器忽略 IF 语句

SQL Server Ignoring IF Statement

每天晚上,我都会备份我的生产服务器并将备份推送到我的开发服务器。然后我的开发服务器有一个运行的作业首先检查备份文件是否存在,如果存在则检查数据库是否存在于开发中,如果存在则删除数据库,然后从文件恢复。这一切都很好,除非文件由于传输缓慢等原因尚未完成。如果作业运行时文件未完全下载,则第一步会发现它存在并删除数据库。下一步尝试恢复,当然失败了。第二天当作业运行时,我希望当它检查数据库是否存在时,它会发现它不存在也不应该尝试删除它并只是恢复。但是,正在发生的事情是作业无法删除数据库,只是在那时失败了。这需要手动干预才能恢复数据库,这是我的问题。我不太关心服务器上一天(理论上)没有数据库的事实,因为我可以进一步调整计划以更快地恢复。我关心的是为什么 IF 语句无法检查数据库是否存在并尝试删除数据库?这是我使用的 T-SQL 代码:

DECLARE @output INT
DECLARE @SqlPath varchar(500) = 'C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Backup\PROD-01_prod_backup.bak'

EXECUTE master.dbo.xp_fileexist @SqlPath, @output OUT
IF @output = 1
BEGIN
    IF (EXISTS (SELECT name FROM master.dbo.sysdatabases WHERE ('[' + name + ']' = '[PROD-01]')))
    BEGIN
        ALTER DATABASE [PROD-01] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
        DROP DATABASE [PROD-01]
    END

    RESTORE DATABASE [PROD-01] FROM DISK = @SqlPath
END

我不确定这是怎么发生的,因为我无法重现,但是 TRY / CATCH 块是这种情况的理想解决方案:

SET XACT_ABORT ON
GO


DECLARE @output INT
DECLARE @SqlPath varchar(500) = 'C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Backup\PROD-01_prod_backup.bak'

EXECUTE master.dbo.xp_fileexist @SqlPath, @output OUT
IF @output = 1
BEGIN
    IF (EXISTS (SELECT name FROM master.dbo.sysdatabases WHERE (name = 'PROD-01')))
    BEGIN TRY
        ALTER DATABASE [PROD-01] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
        DROP DATABASE [PROD-01]
    END TRY
    BEGIN CATCH
        SELECT ERROR_MESSAGE();
    END CATCH

    RESTORE DATABASE [PROD-01] FROM DISK = @SqlPath
END