4

我正在尝试创建一个脚本来创建/设置一组非常相似的存储过程。

所以我试图遍历这段代码,在需要时更改@DATABASE_NAMEand @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 的可能解决方案?

4

3 回答 3

3

我不会将解决方案称为直观的,但显然是可行的。不过我更喜欢这个的外观

于 2013-07-19T04:53:26.010 回答
1

尝试使用使用数据库并创建过程。像这样

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 

这对我来说非常有用

于 2013-07-19T04:28:57.247 回答
1

我尝试了 Nithesh 的答案,但这对我不起作用,它最终在主表中创建了存储过程。泽克的回答奏效了。在我的动态查询中创建一个动态查询。

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 
于 2013-07-19T04:57:01.307 回答