SQL中简单声明变量即触发ERROR 1064 (42000)语法报错
报错原因
触发ERROR 1064语法错误的核心原因是代码混用了SQL Server语法与MySQL语法,且不符合MySQL的语句执行规则,具体问题点如下:
- 变量声明语法错误:
DECLARE @var as int是SQL Server的变量写法,MySQL中DECLARE关键字仅用于存储过程、自定义函数、触发器等存储程序内部的局部变量声明,这类局部变量不需要加@前缀,且必须放在BEGIN块的最起始位置,在所有其他执行语句之前声明;而@var格式的是MySQL会话级用户变量,不需要提前用DECLARE声明,直接赋值即可使用,类型自动适配。 - 流程控制语句执行环境错误:
WHILE循环、BEGIN...END复合语句块属于存储程序语法,不能直接在普通SQL交互窗口裸执行,必须包裹在存储程序单元中才能运行。 - 内置函数与输出语句不兼容:原代码用到的
PRINT输出语句、REPLICATE()字符串重复函数都是SQL Server的内置语法,MySQL中没有这两个对象,输出内容需要用SELECT语句,字符串重复需要调用REPEAT()函数。
正确可运行代码
由于循环逻辑必须放在存储程序中执行,以下代码可以直接在MySQL中运行,实现逐行打印20个到1个星号的逻辑:
-- 临时修改语句分隔符,避免存储过程内的分号被客户端误判为语句结束 DELIMITER // CREATE PROCEDURE print_star_pyramid() BEGIN -- 声明局部变量,直接设置默认值为20 DECLARE var INT DEFAULT 20; WHILE var > 0 DO -- 拼接对应数量的星号并输出 SELECT REPEAT('* ', var) AS star_line; SET var = var - 1; END WHILE; END // -- 恢复默认的分号分隔符 DELIMITER ; -- 调用存储过程执行逻辑 CALL print_star_pyramid(); -- 执行完成后可删除存储过程,避免冗余对象 DROP PROCEDURE IF EXISTS print_star_pyramid;
如果使用的是MySQL 8.0及以上版本,也可以通过递归CTE实现相同逻辑,不需要创建存储过程:
WITH RECURSIVE num_series AS ( SELECT 20 AS num UNION ALL SELECT num - 1 FROM num_series WHERE num > 1 ) SELECT REPEAT('* ', num) AS star_line FROM num_series;
内容的提问来源于stack exchange,提问作者Akshat Kumar Jain
相关产品推荐
相关产品推荐

