【问题标题】:SQL dynamically create stored procedures?SQL动态创建存储过程?
【发布时间】:2013-07-18 06:19:06
【问题描述】:

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

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

【问题讨论】:

  • 你试过将use dbcreate procedure拆分为两个动态sql吗?

标签: sql sql-server-2005 stored-procedures dynamic-sql


【解决方案1】:

我不会将解决方案称为直观的,但显然 this 有效。不过我更喜欢this one 的外观。

【讨论】:

    【解决方案2】:

    尝试使用 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 
    

    这对我来说非常有用

    【讨论】:

    • 这对我来说失败了。在我的“主”数据库上创建了一个存储过程。似乎依赖于您连接的数据库。
    【解决方案3】:

    我尝试了 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 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-17
      相关资源
      最近更新 更多