Using TRY...CATCH in Transact-SQL



我在下面写了T-SQL代码。我想把它放在SQL Server TRY中...捕捉块。但是,由于我必须在继续执行另一个语句之前执行一些语句,因此我使用的是 GO 关键字,这使得代码崩溃而不执行 CATCH 块中的代码。它只是崩溃,就好像没有 CATCH 块一样。如果我删除代码中的 GO 并且代码崩溃,则执行会跳转到 CATCH 块,这是所需的行为。

关于我能做什么的任何想法?

BEGIN TRY
RESTORE FILELISTONLY
FROM DISK = 'D:Folder1Database1.bak'
GO
ALTER DATABASE BusinessData
SET SINGLE_USER WITH
ROLLBACK IMMEDIATE
ALTER DATABASE BusinessData 
SET RECOVERY Simple
RESTORE DATABASE BusinessData
FROM DISK = 'D:Folder1Database1.bak'
WITH MOVE 'BusinessData' TO 'C:MyDATA
BusinessData.mdf',
MOVE 'BusinessData_log' TO 'C:MyDATA
BusinessData_log.ldf'
ALTER DATABASE BusinessData SET MULTI_USER
GO
IF NOT EXISTS (SELECT * FROM sys.server_principals WHERE name = N'SERVER1user1')
CREATE LOGIN [SERVER1user1] FROM WINDOWS WITH DEFAULT_DATABASE=[master], DEFAULT_LANGUAGE=
[us_english]
GO
USE [ProjectServer_Authentication]
GO
IF NOT EXISTS (SELECT * FROM sys.database_principals WHERE name = N'SERVER1user1')
CREATE USER [SERVER1user1] FOR LOGIN [SERVER1user1] WITH DEFAULT_SCHEMA=[dbo]
GO
EXEC sp_addrolemember 'db_owner',N'SERVER1user1'
GO
USE [BusinessData]
IF NOT  EXISTS (SELECT * FROM sys.database_principals WHERE name = N'SERVER1user1')
CREATE USER [SERVER1user1] FOR LOGIN [SERVER1user1] WITH DEFAULT_SCHEMA=[dbo]
GO
EXEC sp_addrolemember 'db_owner',N'SERVER1user1'
GO
END TRY
BEGIN CATCH
USE msdb
GO
EXEC sp_send_dbmail @profile_name='My Mail Profile',
@recipients='myemailaccount@mydomain.org',
@subject='Refresh Error',
@body='Email body'
END CATCH

我认为 GO 是问题所在

GO 不是 Transact-SQL 语句;

它是 sqlcmd 和 osql 实用程序以及 SQL Server Management Studio 代码编辑器识别的命令。SQL Server 实用工具将 GO 解释为它们应将当前一批 Transact-SQL 语句发送到 SQL Server 实例的信号。当前一批语句由自上次 GO 以来输入的所有语句组成,如果这是第一次 GO,则由自临时会话或脚本开始以来输入的所有语句组成

每次 GO 时,您都会开始一个新的语句,这意味着您的开始尝试和结束尝试在 2 个不同的语句中,因此不起作用

最新更新