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

#SET TERMINATOR语句作用是什么?是否需在每个SQL存储过程开头添加?

#SET TERMINATOR 语句常见问题解答

1. 具体作用

该语句是SQL客户端工具(比如Db2命令行处理器、部分兼容SQL的数据库管理工具)的预处理指令,作用是修改SQL语句的默认终止符。
SQL默认的语句终止符是分号;,但存储过程内部的业务逻辑语句(比如查询、增删改、分支循环逻辑等)本身就需要使用分号作为结尾。如果不修改全局终止符,客户端解析代码时遇到存储过程内部的第一个分号,就会误判当前SQL语句已经结束,直接截断执行,必然报语法错误。
比如你给出的示例中,将终止符修改为@后,客户端会一直等到遇到@符号,才会把整段CREATE PROCEDURE代码当成完整的语句提交给数据库执行,不会被内部的分号打断。
注意:该指令属于客户端层面的配置,不属于标准SQL语法,不同数据库的同类指令写法有差异,比如MySQL中对应的是DELIMITER命令。

2. 是否需要在每个存储过程开头添加

不需要每次都加,具体规则如下:

  • 同一段SQL脚本内,只需要在第一个需要使用自定义终止符的代码块之前设置一次即可,后续所有存储过程都可以沿用这个配置,直到你主动修改终止符为止
  • 如果同一段脚本内写完存储过程后,需要执行普通的DML/DDL语句,可以手动将终止符改回默认的分号;,后续如果再新增存储过程才需要重新设置
  • 如果你使用的数据库管理工具已经在UI层面提供了存储过程终止符的配置选项,或者脚本内仅包含单个无内部分号的简单存储过程,也可以省略该语句

参考示例

-- 全局设置一次终止符为@,后续所有存储过程共用该配置
--#SET TERMINATOR @
CREATE PROCEDURE Proc1
LANGUAGE SQL
BEGIN
  SELECT * FROM Table1;
END
@

CREATE PROCEDURE Proc2
LANGUAGE SQL
BEGIN
  SELECT * FROM Table2;
END
@

-- 存储过程全部写完后,改回默认的分号终止符,执行普通SQL语句
--#SET TERMINATOR ;
SELECT * FROM Table1;

内容的提问来源于stack exchange,提问作者LaidBackLuck

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 07:36:04