复制存储过程并修改数据库引用:跨库执行脚本问题
修改脚本实现从源数据库执行存储过程迁移
核心修改点
原脚本删除目标库存储过程的语句未指定数据库上下文,导致只能操作当前激活数据库。只需在DROP PROCEDURE语句中明确指定目标数据库的引用,即可实现从源库执行整个迁移流程。
修改后的完整脚本
-- 删除目标数据库中的所有存储过程(现在可在源库执行) DECLARE @procName varchar(500) DECLARE @Name NVARCHAR(32) = 'DestDB'; -- 目标数据库名称,统一变量便于维护 DECLARE cur1 cursor FOR SELECT [name] FROM [@Name].sys.objects WHERE type = 'p' -- 用变量替代硬编码库名 OPEN cur1 FETCH NEXT FROM cur1 INTO @procName WHILE @@fetch_status = 0 BEGIN -- 直接指定目标数据库+存储过程路径执行删除 EXEC('DROP PROCEDURE [' + @Name + '].[' + @procName + ']') FETCH NEXT FROM cur1 INTO @procName END CLOSE cur1 DEALLOCATE cur1 -- 从源数据库复制所有存储过程到目标数据库 DECLARE @sql NVARCHAR(MAX); DECLARE cur2 CURSOR FOR SELECT Definition FROM [SourceDB].[sys].[procedures] p INNER JOIN [SourceDB].sys.sql_modules m ON p.object_id = m.object_id OPEN cur2 FETCH NEXT FROM cur2 INTO @sql WHILE @@FETCH_STATUS = 0 BEGIN SET @sql = REPLACE(@sql,'''','''''') SET @sql = 'USE [' + @Name + ']; EXEC(''' + @sql + ''')' EXEC(@sql) FETCH NEXT FROM cur2 INTO @sql END CLOSE cur2 DEALLOCATE cur2
关键说明
- 将删除部分的硬编码库名替换为统一变量
@Name,和复制逻辑保持一致,后续修改目标库只需改一处。 - 删除语句通过
[目标库].[存储过程名]的完整路径指定操作对象,无需切换当前数据库上下文,直接在源库即可执行目标库的删除操作。 - 复制逻辑无需修改,原本就通过
USE语句切换到目标库执行创建操作,可正常在源库运行。
内容的提问来源于stack exchange,提问作者Artuskan
相关产品推荐
相关产品推荐

