2013-07-19 146 views
3

我想創建一個腳本來創建/設置一組存儲過程,這些存儲過程都將非常相似。SQL動態創建存儲過程?

所以我試圖循環這段代碼,在需要時更改@DATABASE_NAME@TableName

/* Start loop */ 
    DECLARE @create_stored_procedure nvarchar(max) 
    SET @create_stored_procedure = N' 
     USE [' + @DATABASE_NAME + '] 
     CREATE PROCEDURE [dbo].[sproc_imp_' + @TableName + '] 
     AS 
     BEGIN 
      PRINT(''doing something'') 
     END' 
    EXEC sp_executesql @statement = @create_stored_procedure 
/* End loop */ 

但我得到錯誤說

'CREATE/ALTER PROCEDURE' 必須是查詢批次中的第一個語句。

'CREATE/ALTER PROCEDURE' 不允許指定數據庫名作爲前綴的對象名。

所有在線解決方案都建議使用GO,但這不適用於動態SQL。

有誰知道SQL Server 2005的可能解決方案嗎?

+0

你是否試過將'use db'和'create procedure'分割爲兩個動態sql? – Nithesh

回答

2

我不會把解決方案直觀,但顯然this作品。儘管如此,我更喜歡this one的外觀。

0

嘗試用spiting USe DB並創建過程。像這樣

DECLARE @create_store_procedure nvarchar(max) 

SET @create_store_procedure = N' 
    USE [' + @DATABASE_NAME + '] ' 
EXEC sp_executesql @statement = @create_store_procedure 

SET @create_store_procedure = N' 
    CREATE PROCEDURE [dbo].[sproc_imp_' + @TableName + '] 
    AS 
    BEGIN 
     PRINT(''doing something'') 
    END ' 

EXEC sp_executesql @statement = @create_store_procedure 

這是工作完美的我

+0

這對我來說是失敗的。在我的「主」數據庫上創建一個存儲過程。看起來依賴於你連接的數據庫。 – Zec

1

我試過Nithesh的回答,那對我不起作用,它最終在主表中創建了存儲過程。 Zec的答案奏效了。在我的動態查詢中創建一個動態查詢。

DECLARE @create_store_procedure nvarchar(max) 
DECLARE @use_db nvarchar(max) 

SET @create_store_procedure = N' 
    CREATE PROCEDURE [dbo].[sproc_imp_' + @TableName + '] 
    AS 
    BEGIN 
     PRINT(''doing something'') 
    END ' 

SET @use_db = N' 
USE [' + @DATABASE_NAME + '] 
DECLARE @sub_create_store_procedure nvarchar(max) 
SET @sub_create_store_procedure = ''' + REPLACE(@create_store_procedure, CHAR(39), CHAR(39) + CHAR(39)) + ''' 
EXEC sp_executesql @statement = @sub_create_store_procedure 
' 

EXEC sp_executesql @statement = @use_db