【问题标题】:Using TRY...CATCH in Transact-SQL在 Transact-SQL 中使用 TRY...CATCH
【发布时间】:2014-01-10 13:30:44
【问题描述】:

我已经编写了下面的 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

【问题讨论】:

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


    【解决方案1】:

    我认为 GO 是个问题

    GO 不是 Transact-SQL 语句;

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

    每次 GO 你都会开始一个新的 Statement,这意味着你的 begin Try 和 End Try 在 2 个不同的 Statement 中,因此不起作用

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-25
      • 1970-01-01
      • 1970-01-01
      • 2011-07-12
      • 1970-01-01
      • 2011-02-23
      • 2021-11-25
      • 1970-01-01
      相关资源
      最近更新 更多