将当前数据库里所有存储过程的内容进行批量替换方案
2016-05-24 17:43
603 查看
将当前数据库里所有存储过程里的内容进行批量替换方案
备份存储过程
替换
备份存储过程
USE [MyDB] go IF OBJECT_ID('master..all_proc_before_replace', 'U') IS NOT NULL DROP TABLE master..all_proc_before_replace SELECT o.name AS proc_name, definition , o.type , ' ' AS remark INTO master..all_proc_before_replace --- 做备份,备份到master..all_proc_before_replace FROM sys.sql_modules s , sys.objects o WHERE o.object_id = s.object_id AND o.type = 'P' -- 只指定过程 AND o.name not LIKE 'pr[_]fm[_]%' --剔除掉含fM相关过程 AND s.definition IS NOT NULL --未加密的过程 go
替换
SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO --创建表to_replace_create_proc_error 收集执行替换后的过程报错信息 IF OBJECT_ID('master..to_replace_create_proc_error', 'U') IS NOT NULL DROP TABLE master..to_replace_create_proc_error CREATE TABLE master..to_replace_create_proc_error ( proc_name NVARCHAR(128) , definition NVARCHAR(MAX) , errormsg NVARCHAR(MAX) ) DECLARE @proc_name NVARCHAR(128) , @definition NVARCHAR(MAX) DECLARE c CURSOR FAST_FORWARD FOR SELECT proc_name , definition FROM master..all_proc_before_replace WHERE proc_name NOT LIKE 'pr[_]fm[_]%' --剔除掉停职fm相关过程 OPEN c FETCH NEXT FROM C INTO @proc_name, @definition WHILE @@FETCH_STATUS = 0 BEGIN IF @definition LIKE '%tempdb%' --符合条件的过程,进行替换 BEGIN SET @definition = REPLACE(@definition, '表名', 'TableName') -- 此处可以进行多次 set @definition = REPLACE(@definition, '一', '壹') --SET @definition = REPLACE(@definition, '中心', 'tempdb..#') --SET @definition = REPLACE(@definition, 'tempdb..#WFPUSER#', 'master..#WFPUSER#') BEGIN TRY BEGIN TRANSACTION drop_create_proc EXEC ( ' DROP PROC [' + @proc_name +']' ) -- 先DROP EXEC ( @definition )-- 再CREATE UPDATE master..all_proc_before_replace -- 将已经替换后执行成功的,进行标记 SET remark = 'Y' WHERE proc_name = @proc_name COMMIT TRANSACTION drop_create_proc END TRY BEGIN CATCH ROLLBACK TRANSACTION drop_create_proc INSERT INTO master..to_replace_create_proc_error --将已经替换后执行不成功的,收集报错信息内容 SELECT @proc_name , @definition , ERROR_MESSAGE() END CATCH END FETCH NEXT FROM C INTO @proc_name, @definition END CLOSE c DEALLOCATE c IF EXISTS ( SELECT * FROM master..to_replace_create_proc_error ) BEGIN ---- 返回报错,便于查找 RAISERROR 999999 ' 本数据库中,有过程对象未替换完成,请手工处理 ' END
相关文章推荐
- sql语句生成sqlserver表架构
- MySQL外键在数据库中的作用
- 【plsql】win7上程序无法启动,开启DEP解决
- 数据库之SQL的主键和外键的作用
- mysql自动增长怎么恢复从1开始
- mysql进程命令(转)
- navicat 连接远程的oracle数据库遇到的问题
- SQL命令和常用语句大全
- 揭秘Sql2014新特性-tempdb性能提升
- MySQL单表数据记录查询经典语句
- java连接oracle
- MongoDB 学习笔记(一)-MongoDB配置
- memcached server down, pylibmc 来handle error
- 浅述Oracle分布式事务概念
- MongoDB创建数据库和删除数据库
- mysql 按每小时分组统计(行转列)
- oracle 归档模式
- Sql Server tempdb原理-缓存机制解析实践
- Oracle数据库维护
- MYSQL 性能分析及explain用法(2)