MySQL存储过程循环中变量声明错误求助
解决MySQL存储过程批量添加列的语法错误
兄弟我完全懂你这种快被逼疯的心情!MySQL和SQL Server的语法差异真的很容易让人踩坑,你现在的问题核心就是把SQL Server的写法直接套到MySQL里了,咱们把这些坑一个个填上:
你代码里的几个关键错误
- 局部变量声明错误:MySQL里局部变量不需要加
@前缀,DECLARE @FooA是SQL Server的写法,MySQL会直接报错。局部变量直接写DECLARE FooA VARCHAR(1000);就行。 - 字符串拼接错误:MySQL里不能用
+拼接字符串(这是算术运算符),要用CONCAT()函数来拼接动态SQL语句。 - 数据类型错误:MySQL里没有
NVARCHAR(MAX),直接用VARCHAR(MAX)或者根据实际需求定义长度(这里用VARCHAR(1000)完全足够生成你的ALTER语句)。 - 动态SQL执行错误:MySQL执行动态SQL不用
sp_executesql,而是用PREPARE、EXECUTE、DEALLOCATE PREPARE这一套流程。
修正后的完整存储过程代码
USE mydatabase; DELIMITER $$ DROP PROCEDURE IF EXISTS RepeatLoopProc$$ CREATE PROCEDURE RepeatLoopProc() BEGIN DECLARE x INT; DECLARE sn VARCHAR(30); DECLARE dr VARCHAR(48); DECLARE FooA VARCHAR(1000); -- 去掉@,改用MySQL的局部变量声明 SET x = 0; WHILE (x <= 150) DO SET sn = CONCAT('drivesn_', x); SET dr = CONCAT('driveinf_', x); -- 用CONCAT拼接动态SQL,替换原来的+ SET FooA = CONCAT('ALTER TABLE DRIVE_MASTER ADD ', sn, ' VARCHAR(30), ADD ', dr, ' VARCHAR(48)'); -- MySQL的动态SQL执行方式 PREPARE stmt FROM FooA; EXECUTE stmt; DEALLOCATE PREPARE stmt; SET x = x + 1; END WHILE; END$$ DELIMITER ;
执行方法
调用这个存储过程就能批量添加你需要的列了:
CALL RepeatLoopProc();
执行完之后,你的DRIVE_MASTER表就会有drivesn_0到drivesn_150、driveinf_0到driveinf_150这些列,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Jeff Johnson
相关产品推荐
相关产品推荐

