0
我有下面寫的T-SQL代碼。我想把它放在一個SQL Server TRY ... CATCH塊中。但是,因爲在繼續使用另一個語句之前我必須執行一些語句,所以我使用了GO關鍵字,這使代碼崩潰而不執行CATCH塊中的代碼。它只是崩潰,好像沒有CATCH塊。如果我在代碼中刪除GO並且代碼崩潰,則執行跳轉到所需行爲的CATCH塊。在Transact-SQL中使用TRY ... 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='[email protected]',
@subject='Refresh Error',
@body='Email body'
END CATCH