2013-07-19 98 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