0

下面的查询返回多个表名。

SET @var2 = 'col1';

SELECT table_name
FROM information_schema.columns
WHERE table_schema = 'db1'
and column_name like @var2

我需要将 table_name 的值存储在数组中并通过 UPDATE 语句对其进行循环。所以我试着这样。[重写上述查询]

SELECT table_name into @var3
FROM information_schema.columns
WHERE table_schema = 'db1'
and column_name like @var2


UPDATE @var3 SET @var2='Test' WHERE 1=1

实际上 UPDATE 语句必须运行表计数的次数。

我收到错误,因为 var3 不能保存很多值。所以我希望它是一个数组,从而通过一个 UPDATE 语句循环它。有什么想法可以继续吗?

4

1 回答 1

1

我认为您需要在存储过程中遍历游标。像这样的东西,

DECLARE t_name VARCHAR(100);
DECLARE not_found_t_names INT DEFAULT 0;

DECLARE cur_table_names CURSOR FOR 
SELECT table_name
FROM information_schema.columns
WHERE table_schema = 'db1'
and column_name like @var2

DECLARE CONTINUE HANDLER FOR NOT FOUND SET not_found_t_names = 1;

OPEN cur_table_names;
  SET not_found_t_names = 0;
  t_name_loop : LOOP 
  FETCH cur_table_names INTO t_name;
  IF not_found_t_names THEN
      CLOSE cur_table_names;
      LEAVE t_name_loop;
  END IF;

  SET @update_stmt = CONCAT('UPDATE ',t_name,' SET ',@var2,'=Test WHERE 1=1');

  PREPARE stmt FROM @update_stmt;
  EXECUTE stmt;
  DEALLOCATE PREPARE stmt;

 END LOOP;

由于您正在使用变量中的结构元素,因此有点棘手,因此您需要concat正确执行。我没有测试这个的环境,所以如果有任何需要修复的话,请自己进行语法更正,但我认为这将是这样做的方法。应该工作,祝你好运!

于 2013-06-14T05:53:51.277 回答