2014-01-10 42 views
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 

回答

1

我覺得走的是問題,因爲

GO不是Transact-SQL語句;

它是由sqlcmd和osql實用程序和SQL Server Management Studio代碼編輯器識別的命令。 SQL Server實用程序將GO解釋爲應將當前一批Transact-SQL語句發送到SQL Server實例的信號。 當前批次報表由自上次GO以來輸入的所有語句組成,或自特設會話或腳本開始以來輸入的所有語句(如果這是第一個GO)。

隨着每一次去,你開始一個新的聲明,至極意味着你開始嘗試和您的最終嘗試有兩種不同的報表,因此無法正常工作