You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

复制存储过程并修改数据库引用:跨库执行脚本问题

修改脚本实现从源数据库执行存储过程迁移

核心修改点

原脚本删除目标库存储过程的语句未指定数据库上下文,导致只能操作当前激活数据库。只需在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 16:33:26