Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server忽略IF语句_Sql Server_Tsql_Sql Server 2008 R2 - Fatal编程技术网

Sql server SQL Server忽略IF语句

Sql server SQL Server忽略IF语句,sql-server,tsql,sql-server-2008-r2,Sql Server,Tsql,Sql Server 2008 R2,每天晚上,我备份我的生产服务器,并将备份推送到我的开发服务器。然后,我的dev服务器有一个运行的作业,该作业首先检查备份文件是否存在,如果存在,则检查数据库是否存在于dev中,如果存在,则删除数据库,然后从文件还原。这一切都可以正常工作,除非文件由于传输速度慢等原因尚未完成。如果作业运行时文件未完全下载,则第一步会看到它存在并删除数据库。下一步尝试恢复,当然失败了。第二天,当作业运行时,我希望当它检查数据库是否存在时,它会看到它没有也不应该尝试删除数据库并进行恢复。但是,实际情况是作业无法删除数

每天晚上,我备份我的生产服务器,并将备份推送到我的开发服务器。然后,我的dev服务器有一个运行的作业,该作业首先检查备份文件是否存在,如果存在,则检查数据库是否存在于dev中,如果存在,则删除数据库,然后从文件还原。这一切都可以正常工作,除非文件由于传输速度慢等原因尚未完成。如果作业运行时文件未完全下载,则第一步会看到它存在并删除数据库。下一步尝试恢复,当然失败了。第二天,当作业运行时,我希望当它检查数据库是否存在时,它会看到它没有也不应该尝试删除数据库并进行恢复。但是,实际情况是作业无法删除数据库,并且在该点失败。这需要手动干预才能恢复数据库,这是我的问题。我不太关心服务器上有一天没有数据库这一事实(理论上),因为我可以进一步调整时间表以更快地恢复。我所关心的是,为什么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

您是否检查了数据库的
状态
,查看它是否处于海森堡状态,如加载或恢复,介于现有和不存在之间?此外,这也是您应该使用try-catch的原因,我只需在数据库上使用restore,无需删除它,因此,如果失败,它将被回滚。@HABO Yes,我已手动检查,它显示它不存在,没有停留在任何其他状态。@scsimon我最初是这样做的,但我添加了一些附加步骤,这些步骤没有包含在上面的t-SQL中,例如从表中删除列和恢复某些权限。如果我没有先删除表,并且还原失败,那么删除列会导致作业失败,或者其他用户权限是孤立的。在其他服务器上还原时,肯定会发生孤立登录。。。但仅提供部分代码很难完全排除故障。您得到的确切错误消息是什么?正是我所需要的。非常感谢你!