在Transact-SQL中使用TRY ... CATCH

时间:2014-01-10 13:30:45

标签: sql-server tsql sql-server-2005 try-catch

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

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

BEGIN TRY
RESTORE FILELISTONLY
FROM DISK = 'D:\Folder1\Database1.bak'
GO

ALTER DATABASE BusinessData
SET SINGLE_USER WITH
ROLLBACK IMMEDIATE

ALTER DATABASE BusinessData 
SET RECOVERY Simple

RESTORE DATABASE BusinessData
FROM DISK = 'D:\Folder1\Database1.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'SERVER1\user1')
CREATE LOGIN [SERVER1\user1] 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'SERVER1\user1')
CREATE USER [SERVER1\user1] FOR LOGIN [SERVER1\user1] WITH DEFAULT_SCHEMA=[dbo]
GO
EXEC sp_addrolemember 'db_owner',N'SERVER1\user1'
GO

USE [BusinessData]
IF NOT  EXISTS (SELECT * FROM sys.database_principals WHERE name = N'SERVER1\user1')
CREATE USER [SERVER1\user1] FOR LOGIN [SERVER1\user1] WITH DEFAULT_SCHEMA=[dbo]
GO
EXEC sp_addrolemember 'db_owner',N'SERVER1\user1'
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

1 个答案:

答案 0 :(得分:1)

我认为GO就是问题

  

GO不是Transact-SQL语句;

     

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

对于每一个GO,你开始一个新的声明,这意味着你的开始尝试和你的结束尝试是在两个不同的陈述,因此无法正常工作