You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 18:06:25