SQL Server 2008 R2 - 以编程方式将存储过程从一个数据库复制到另一个数据库

时间:2012-03-07 20:34:07

标签: sql-server-2008 tsql stored-procedures

我正在开发一个应用程序,它将为每个订阅者提供单独的数据库。当需要新数据库时,主数据库上的存储过程将触发。它创建一个新的db和默认表。到现在为止还挺好。现在我需要将几个存储过程从主数据库复制到新创建的数据库。我不想维护脚本或使用第三方工具,它需要是动态的。

现在我从sql_modules中获取SP内容,然后尝试对新数据库执行此操作。问题是我不知道如何更改exec()触发的数据库,运行此存储过程的默认数据库是Master,我需要它作为目标。我已经尝试将过程声明更改为CREATE PROCEDURE [MyNewDb].[dbo].[AwesomeSP],但是sql抱怨

  

'CREATE / ALTER PROCEDURE'不允许指定数据库名称   作为对象名称的前缀。

回答:

Arghh!由于this blog post found on kodyaz.com,这比预期的要容易。希望它会帮助别人。

以下是将Master数据库中的所有sp复制到目标数据库的代码,您可以通过过滤程序名称上的查询来复制您喜欢的sp。

  • @sql定义为nvarchar(max)
  • @Name是目标数据库

代码:

DECLARE c CURSOR FOR 
   SELECT Definition
   FROM [ResiDazeMaster].[sys].[procedures] p
   INNER JOIN [ResiDazeMaster].sys.sql_modules m ON p.object_id = m.object_id

OPEN c

FETCH NEXT FROM c INTO @sql

WHILE @@FETCH_STATUS = 0 
BEGIN
   SET @sql = REPLACE(@sql,'''','''''')
   SET @sql = 'USE [' + @Name + ']; EXEC(''' + @sql + ''')'

   EXEC(@sql)

   FETCH NEXT FROM c INTO @sql
END             

CLOSE c
DEALLOCATE c

2 个答案:

答案 0 :(得分:0)

执行dbname.dbo.sp_executesql N'CREATE PROCEDURE ...'将起作用。所以,你可以构建一个完成所有这些的字符串。您可以将SET @sql ='使用...替换为:

set @sql = N'execute ' + QUOTENAME(@name) + N'.dbo.sp_executesql N''' + @sql + ''''

答案 1 :(得分:0)

这对我有用:

  

设置@ script = @ destDB +'。dbo.sp_executesql N'''+ @ spDefenition +''''

     

exec sp_executesql @script