2011-12-17 49 views
1

嗨,我是綁來運行ALTER DATABASE語句,並不斷收到錯誤: (這是一個腳本,將運行鍼對多個數據庫去)語法問題,使用alter database和set命令

SELECT is_broker_enabled FROM sys.databases WHERE name = db_name() 

DECLARE @SQL NVARCHAR(1024) 


IF (SELECT is_broker_enabled FROM sys.databases WHERE name = db_name()) = 0 
BEGIN 

    SET @SQL = N'ALTER DATABASE [' + db_name() + '] SET SINGLE_USER WITH ROLLBACK IMMEDIATE'; 
    SELECT @SQL; 
    sp_executesql @SQL; 

    SET @SQL = N'ALTER DATABASE [' + db_name() + '] SET ENABLE_BROKER'; 
    SELECT @SQL; 
    sp_executesql @SQL; 


    SET @SQL = N'ALTER DATABASE [' + db_name() + '] SET MULTI_USER'; 
    SELECT @SQL; 
    sp_executesql @SQL; 

END 

SELECT is_broker_enabled FROM sys.databases WHERE name = db_name() 

我不斷收到

Msg 102, Level 15, State 1, Line 11 Incorrect syntax near 'sp_executesql'. Msg 102, Level 15, State 1, Line 15 Incorrect syntax near 'sp_executesql'. Msg 102, Level 15, State 1, Line 20 Incorrect syntax near 'sp_executesql'.

我做了愚蠢的事情 - 但像期待看到不產生大部分的語法問題...

回答

2

與嘗試關鍵字,像這樣:

exec sp_executesql @SQL; 

這就是你如何從一個存儲過程中調用另一個存儲過程的方式(你也可以使用EXECUTE,它不完全一樣)。注意不要將其與Exec(...)函數(see also here)混淆。

+0

dhhhhooooooooo ... – 2011-12-19 08:49:10

1

嘗試這種情況:

EXECUTE sp_executesql @SQL; 
+0

謝謝,你只是毆打衝 – 2011-12-19 08:51:25

3

調用存儲過程而不EXEC只允許作爲在間歇的第一行。你的電話不是。

你是否也考慮過這個構造一次完成?

SET @SQL = N' 
ALTER DATABASE [' + db_name() + '] SET SINGLE_USER WITH ROLLBACK IMMEDIATE; 
ALTER DATABASE [' + db_name() + '] SET ENABLE_BROKER; 
ALTER DATABASE [' + db_name() + '] SET MULTI_USER; 
'; 
SELECT @SQL; 
EXEC sp_executesql @SQL; 
+0

不知道有關的EXEC是該批次中的第一行您的評論 - 我知道它的真正的創造 - 但即使你沒有它作爲第一行...經過一些測試 - 它的EXEC導致它的工作。別擔心,我因爲錯過了執行官而感到愚蠢! – 2011-12-19 08:48:24

+0

@Ian P:這意味着你可以在EXEC *中只留下*第一行代碼。任何其他存儲的proc調用都需要EXEC。 – gbn 2011-12-19 08:50:18

+0

Didnt知道 - 但我想它必須是真實的,否則突出顯示在SSMS和 proc將無法正常工作。仍然希望我不會忘記執行另一個5年 – 2011-12-20 09:23:34