当前位置: 代码网 > it编程>数据库>MsSqlserver > SQLyog中DELIMITER执行存储过程时出现前置缩进问题的解决方法

SQLyog中DELIMITER执行存储过程时出现前置缩进问题的解决方法

2025年05月03日 MsSqlserver 我要评论
问题根源sqlyog的语句分隔逻辑:sqlyog默认会根据分号(;)和换行自动分隔sql语句当代码有缩进时,sqlyog可能错误地将缩进后的内容识别为新的sql语句delimiter的敏感性:deli

问题根源

  1. sqlyog的语句分隔逻辑

    • sqlyog默认会根据分号(;)和换行自动分隔sql语句

    • 当代码有缩进时,sqlyog可能错误地将缩进后的内容识别为新的sql语句

  2. delimiter的敏感性

    • delimiter //命令必须独立一行且无前导空格

    • 任何缩进都会导致sqlyog将其视为普通文本而非指令

  3. 存储过程体内的语句

    • 过程体内的缩进不会影响执行(因为是作为整体解析)

    • 但过程体外的命令(如delimiter)必须无缩进

正确写法示例

-- 必须顶格写(无缩进)
delimiter //
create procedure grant_role_to_all_users()
begin
    -- 这里面的缩进不会影响执行
    declare finished integer default 0;
    declare user_host varchar(255);
    
    declare user_cursor cursor for 
        select concat('`',user,'`@`',host,'`') 
        from mysql.user 
        where user not in ('root','mysql.sys','mysql.session','mysql.infoschema');
    
    declare continue handler for not found set finished = 1;
    
    open user_cursor;
    
    get_user: loop
        fetch user_cursor into user_host;
        if finished = 1 then leave get_user; end if;
        
        set @grant_sql = concat('grant "public_role" to ', user_host);
        prepare stmt from @grant_sql;
        execute stmt;
        deallocate prepare stmt;
        
        set @default_sql = concat('set default role "public_role" for ', user_host);
        prepare stmt from @default_sql;
        execute stmt;
        deallocate prepare stmt;
    end loop get_user;
    
    close user_cursor;
end//
-- 必须顶格写(无缩进)
delimiter ;

永久解决方案

  1. 关闭sqlyog的自动分隔功能

    • 菜单栏 → 工具 → 首选项 → 查询编辑器

    • 取消勾选"自动分隔sql语句"

  2. 使用批处理执行模式

    • 全选所有代码(包括delimiter)

    • 按 ctrl+shift+f9(批处理执行)而非普通执行

  3. 检查编辑器设置

    • 确保没有开启"智能缩进"或"语法感知缩进"功能

为什么命令行不受影响?

mysql原生命令行客户端:

  • 完全依赖delimiter指令

  • 不关心缩进和格式

  • 直到遇到定义的结束符(如//)才会执行

而sqlyog等图形工具为提高易用性,会尝试自动解析sql结构,导致对格式敏感。

最佳实践建议

  1. 存储过程创建语句建议:

    • delimiter和end//必须顶格

    • 过程体内的缩进保持一致性(4空格或1个tab)

  2. 复杂过程建议:

-- 顶格
delimiter //
create procedure proc_name()
begin
    -- 缩进内容
    select * from table;
end//
-- 顶格
delimiter ;

保存为脚本文件后通过命令行执行:

mysql -u user -p db_name < procedure.sql

到此这篇关于sqlyog中delimiter执行存储过程时出现的前置缩进问题的解决方法的文章就介绍到这了,更多相关sqlyog delimiter出现前置缩进内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com