我正在开发一个应用程序,它将为每个订阅者提供单独的数据库。当需要新数据库时,主数据库上的存储过程将触发。它创建一个新的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
答案 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