sqlserver使用存储过程替换字段内容中的特定字符

原创  微微一笑抽了筋   2020-05-21   169人阅读  0 条评论

问题:优化某个功能时,发现以前的代码逻辑写反了,于是将其改正,但是这个时候数据库中已经保存了许多有误的数据,如:以前代码中对于用‘,’分隔的内容,用的是A方法处理;用‘&’分隔的内容,用的是B方法处理,于是保存到数据库中就是这样--A:a,b,c    B:a&b&c。现在,需要将这两种分隔符替换过来,变成--A:a&b&c    B:a,b,c。

旧数据:

image.png

执行存储过程后的数据:

image.png


下面是处理数据的存储过程:

CREATE PROCEDURE [dbo].[changeBoardContent]
AS
BEGIN
		Declare @temp varchar(50);-- 游标的临时变量
		Declare @contentStr varchar(50);-- 需要替换的内容
		Declare @splitStr VARCHAR(10); --(替换前)分隔符
		Declare @replaceStr VARCHAR(10); --(替换后)分隔符
		
		--创建临时表,复制表board_theme_sys_show数据,新增标记数据是否已经处理,默认值为0
 		EXEC(
 				'IF NOT EXISTS(SELECT * FROM sysobjects WHERE name=''temp_board_theme_sys_show'') 
 				select * Into [temp_board_theme_sys_show] from [board_theme_sys_show];
 				IF COL_LENGTH(''temp_board_theme_sys_show'',''changeFlag'')	IS NULL
 				alter table temp_board_theme_sys_show add changeFlag int;'
 		)
		
		/*第一次替换,将表board_theme_sys_show中的order_context字段内容包含的&符号替换为,*/
		set @splitStr='&';
		set @replaceStr=',';
		
		--取临时表中order_context字段包含&的全部数据,以id的值作为游标值
		Declare content_cursor1 cursor --定义一个游标
		for( select id from temp_board_theme_sys_show where changeFlag is null and order_context like '%'+@splitStr+'%') 
		open content_cursor1 --打开游标
		fetch next from content_cursor1 into @temp;--获取游标值到 临时变量中
		--开始循环
		while @@FETCH_STATUS=0
			begin 
				--将查询替换的内容赋值到变量中
				select @contentStr=(
						select REPLACE(order_context,@splitStr,@replaceStr) from temp_board_theme_sys_show where id=@temp
				)
				--替换board_theme_sys_show表中的内容
				update board_theme_sys_show set order_context=@contentStr where id=@temp;
				--将临时表的标记修改为1
				update temp_board_theme_sys_show set changeFlag=1 where id=@temp;
				--结束当前循环,并获取下一个游标
				fetch next from content_cursor1 into @temp;
			end
			close content_cursor1 --关闭游标
			deallocate content_cursor1 --释放游标
			
			/*第二次替换,将表board_theme_sys_show中的order_context字段内容包含的,符号替换为&*/
			set @splitStr=',';
			set @replaceStr='&';
			
			--取临时表中order_context字段包含,的全部数据,以id的值作为游标值
			Declare content_cursor2 cursor --定义一个游标
			for( select id from temp_board_theme_sys_show where changeFlag is null and order_context like '%'+@splitStr+'%') 
			open content_cursor2 --打开游标
			fetch next from content_cursor2 into @temp;--获取游标值到 临时变量中
			--开始循环
			while @@FETCH_STATUS=0
				begin 
					--将查询替换的内容赋值到变量中
					select @contentStr=(
						select REPLACE(order_context,@splitStr,@replaceStr) from temp_board_theme_sys_show where id=@temp
					)
					--替换board_theme_sys_show表中的内容
					update board_theme_sys_show set order_context=@contentStr where id=@temp;
					--将临时表的标记修改为1
					update temp_board_theme_sys_show set changeFlag=1 where id=@temp;
					--结束当前循环,并获取下一个游标
					fetch next from content_cursor1 into @temp;
				end
			close content_cursor2 --关闭游标
			deallocate content_cursor2 --释放游标
END


    本文地址:https://www.lee2333.com/?id=32
    版权声明:本文为原创文章,版权归 微微一笑抽了筋 所有,欢迎分享本文,转载请保留出处!

    发表评论


    表情

    还没有留言,还不快点抢沙发?