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

Sql server 2008 SQL Server 2008 R2-以编程方式将存储过程从一个数据库复制到另一个数据库,sql-server-2008,tsql,stored-procedures,Sql Server 2008,Tsql,Stored Procedures,我正在开发一个应用程序,将为每个订户提供一个单独的数据库。当需要一个新的数据库时,主数据库上的一个存储过程就会触发。它创建一个新的db和默认表。到现在为止,一直都还不错。现在我需要将几个存储过程从主数据库复制到新创建的数据库。我不想维护脚本或使用第三方工具,它需要是动态的 现在,我正在从sql_模块获取SP内容,然后尝试针对新的db执行它。问题是我不知道如何更改exec()所针对的数据库,运行此存储过程时的默认数据库是主数据库,我需要它作为目标数据库。我尝试将过程声明更改为CREATE proc

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

现在,我正在从sql_模块获取SP内容,然后尝试针对新的db执行它。问题是我不知道如何更改exec()所针对的数据库,运行此存储过程时的默认数据库是主数据库,我需要它作为目标数据库。我尝试将过程声明更改为
CREATE procedure[MyNewDb].[dbo].[AwesomeSP]
,但sql有问题

“创建/更改过程”不允许指定数据库名称 作为对象名称的前缀

答复如下:

啊!这比预期的要容易得多,这要归功于。希望它能帮助其他人

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

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


有效的方法是执行dbname.dbo.sp_executesql N'CREATE PROCEDURE…'。因此,您可以构建一个字符串来完成所有这些。您可以替换您的集合@sql='使用。。。与:

set @sql = N'execute ' + QUOTENAME(@name) + N'.dbo.sp_executesql N''' + @sql + ''''
这对我很有用:

set@script=@destDB+'.dbo.sp_executesql N'+@spdefinition+''

exec sp_executesql@script


在它前面加上Use-SomeDB也不起作用。我通过创建一个模板数据库,对其进行备份,然后进行有趣的恢复来避免这种头痛。您是否怀疑一种方法比另一种方法有任何性能优势?你的方法可能会减少几个机器周期,这取决于如何评估使用。哦,它可能会快一点,但我怀疑它是否会非常重要。我认为帖子下面的评论表明它不起作用,但我想那是别人的经历。我确实认为了解dbname.dbo.sp_builtinproc技巧是件好事,因为多年来,当我不得不从不同的数据库运行而不是从我想要的上下文运行时,我已经使用了它。例如,您可以执行mydb.dbo.sp_help objectinmydb。
set @sql = N'execute ' + QUOTENAME(@name) + N'.dbo.sp_executesql N''' + @sql + ''''