将当前数据库里所有存储过程的内容进行批量替换方案


将当前数据库里所有存储过程里的内容进行批量替换方案

  1. 备份存储过程
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 
  1. 替换
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   
时间: 2024-11-09 14:37:23

将当前数据库里所有存储过程的内容进行批量替换方案的相关文章

day7_读excel内容,写到数据库里

# 需求分析:# 1.读出stu.xls文件里的内容# 2.判断,如果是1用已交作业表示,如果是空用未交作业表示# 3.拼接sql# 4.插入到数据库里的jxz_stu表里,四个字段为name,c1,c2,c3 def con_mysql(sql): import pymysql conn = pymysql.connect(host = '211.149.218.16',user = 'jxz',password = '123456',db = 'jxz',charset = 'utf8')

java导出数据库里的数据至Excel进行数据备份

调用部分: package com.otdrmsys.action; import com.otdrmsys.util.ResultSetToExcel; public class ExcelExport { public static void main(String[] args) { // String fileName = "otdr";//文件名,不带路径,不带.xls后缀 // String [] coloumItems = {"otdr编号",&quo

【WPF学习笔记】之如何把数据库里的值读取出来然后显示在页面上:动画系列之(六)

...... 承接系列五 上一节讲了,已经把数据保存到数据库并且删除数据,本讲是把已经存在的数据从数据库里读取出来,显示在页面上. 主页面后台代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using Sys

在Code first中使用数据库里的视图

如果想在Code first中使用数据库里的视图 (不管你出于什么原因),目前的方法有2种. 一.使用Database.SqlQuery<T>("查询语句"),如: var query = db.Database.SqlQuery<ReplyStatusViewModel>("SELECT * FROM dbo.vReplyStatus") 然后在vReplyStatus视图的基础上进行各种查询: var qqo = query.Where(

三大数据库下的存储过程实现通用分页

三大数据库下的存储过程实现通用分页  SqlServer数据库下通用存储过程实现分页: 1 --通用存储过程分页 2 CREATE PROCEDURE procList 3 --我们需要传入的参数 4 @strWhere NVARCHAR(max), --查询条件 5 @PageSize INT, --每页显示多少条内容 6 @PageIndex INT , --当前页 7 @TableName NVARCHAR(max), --需要查询的表名 8 @ColName NVARCHAR(max),

thinkphp从数据库里的html代码显示页面不解析

首先,这个问题不应该出现在这里,因为以前在用ThinkPHP3.1.2的时候,利用富文本编辑器保存文本后,直接从数据库里面取出的数据都能正常显示,改用ThinkPHP3.2.3之后,thinkphp从数据库里的html代码显示页面不解析,直接显示源代码了,这个问题其实很简单,只是当时很着急,没有想到. 一般出现问题之后,要从源头开始思考,找原因,不是立即百度或Google.今早起来的时候想了一下,所有的数据文件都是从我的数据库里面显示出来的,问题应该就出现在数据的获取和数据的展示途中.果然,打开

数据库索引,存储过程,视图,事务

一,索引索引是一个独立的,物理的数据库结构,可以快速找到表或视图的信息通常情况下只有需要经常查询索引列中的数据时才在表上创建索引基本语法:CREATE INDEX StockIndexON appSchema.StockEvents (StockSymbol);创建唯一索引:Create unique index 索引名称On 表名(字段1,字段2)聚集索引:clustered 每个键值只有一个聚集索引非聚集索引noclustered:索引的键值包含指向表中记录存储位置的指针,不对表中数据排序聚

使用Kettle调用数据库中的存储过程

使用kettle调用存储过程,传入参数传出参数. 存储过程的内容如下,主要是传入一个表名字和一个数字类型的返回值. 那么能得到表的行数. CreateOr Replace Procedure p_Emp_Cnt(t In Varchar2, Num Out Number) Is   v_Sql Varchar2(600);   Lv_Cnt Number; Begin   Select Count(*)     Into Lv_Cnt     From User_Tables    Where 

查找数据库里所有表当前的最大id

今天要统计一下数据库里所有表当前的最大id,一个一个查太麻烦了,就写了一个存储过程,方便今后继续使用. CREATE PROCEDURE [dbo].[get_tableid] AS CREATE TABLE  #tablespaceinfo                         --创建结果存储表 (nameinfo varchar(50) , max_idinfo int ) DECLARE @tablename varchar(255)  --表名称 DECLARE @max_i