使用存储过程批量修改表数据

背景如下:线上有一个表的字段保存的是逗号分隔的图片链接集合,类似"http://123.jpg?asss=xasda,http://12333.jpg?asss=xasda1"这种。因为配置错误导致部分链接的后缀错误,图片无法访问。需要去掉每个链接?之后的内容,如下:"http://123.jpg,http://12333.jpg"结果。

思路就是:

查出要修改的所有记录,循环,使用CHAR_LENGTH(url)-CHAR_LENGTH(REPLACE(url,',',''))计算字符串逗号的个数num,循环num+1次。

使用SUBSTRING_INDEX(url, ',', i);获取字符串中逗号前的子串http://123.jpg?asss=xasda。使用SUBSTRING_INDEX(str, '?', 1)获取?号前子串http://123.jpg。拼接到结果中CONCAT(str_arr, str, ',')

最后判断去掉结尾的逗号,if (RIGHT(str_arr,1)=',') THEN
                     set str_arr=LEFT(str_arr,LENGTH(str_arr)-1);

小技巧:存储过程的调式比较困难 ,可以通过在代码中插入SELECT语句来查看变量值如SELECT tid,url;

代码如下:


CREATE PROCEDURE `updateUrl`(in p1 VARCHAR(255))
 BEGIN
 	   DECLARE done INT DEFAULT FALSE;
     -- 定义字段变量
     DECLARE tid INT;
     DECLARE url TEXT;
     DECLARE i INT DEFAULT 1;
 	 DECLARE num INT DEFAULT 1;
     DECLARE str TEXT;
     DECLARE str_arr TEXT DEFAULT '';
    -- 声明游标变量
     DECLARE cur CURSOR FOR SELECT id,img_url_list as url FROM `zhcj_park_record` WHERE create_time>p1  ORDER BY create_time DESC;
    -- 定义绑定游标结果的变量有值时done = TRUE
   DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;	        
     -- 打开游标
     OPEN cur;
    
    -- 开始循环
     loop_label: LOOP
         SET str_arr = '';
        -- 获取下一条数据
         FETCH cur INTO tid, url;
         SELECT tid,url;
        -- 判断是否已经遍历完所有数据
         IF done THEN
             LEAVE loop_label;
         END IF;
	-- 逗号个数
 			set num= CHAR_LENGTH(url)-CHAR_LENGTH(REPLACE(url,',',''));
 	WHILE (i <= num+1) DO
 	SET str = SUBSTRING_INDEX(url, ',', i);
 	SET url=REPLACE(url,CONCAT(str, ','),'');
 	SET str = SUBSTRING_INDEX(str, '?', 1);
 	SET str_arr = CONCAT(str_arr, str, ',');
 	SELECT str_arr;
 	SET i = i + 1;
 	END WHILE;
 			if (RIGHT(str_arr,1)=',') THEN
 					set str_arr=LEFT(str_arr,LENGTH(str_arr)-1);
 			END IF;
        -- 执行更新操作
         UPDATE zhcj_park_record SET img_url_list = str_arr WHERE id = tid;
     END LOOP loop_label;  
    -- 关闭游标
     CLOSE cur;
 		SELECT 1;
 END
 CALL updateUrl('2023-09-06 20:00:37');
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用存储过程来实现批量插入数据。以下是一个示例的存储过程,用于在数据批量插入数据: ```sql CREATE PROCEDURE InsertBatchData @tableName nvarchar(50), @data xml AS BEGIN DECLARE @insertQuery nvarchar(max) SET @insertQuery = 'INSERT INTO ' + @tableName + ' (column1, column2, column3) SELECT data.value(''column1[1]'', ''int''), data.value(''column2[1]'', ''nvarchar(50)''), data.value(''column3[1]'', ''datetime'') FROM @data.nodes(''//row'') AS t(data)' EXEC sp_executesql @insertQuery, N'@data xml', @data END ``` 在这个存储过程中,`@tableName` 是要插入数据的目标名,`@data` 是包含要插入数据的 XML 格式变量。在实际使用时,你可以根据目标的结构和数据进行适当的修改。 要使用这个存储过程,你可以执行以下代码: ```sql DECLARE @data xml SET @data = ' <rows> <row> <column1>1</column1> <column2>Value1</column2> <column3>2022-01-01</column3> </row> <row> <column1>2</column1> <column2>Value2</column2> <column3>2022-02-01</column3> </row> ... </rows>' EXEC InsertBatchData 'YourTableName', @data ``` 在这个示例中,`@data` 变量包含了要插入的数据,以 XML 格式进行示。你可以根据实际情况修改这个 XML 变量来适应你的数据。同时,将 `'YourTableName'` 替换为你的目标名。 请注意,在实际使用存储过程时,确保传递的数据格式正确且与目标的结构匹配,以避免插入错误的数据
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值