DBeaver中SQL Server MERGE语句分号语法错误排查求助
DBeaver中SQL Server脚本分号语法错误排查与解决
问题现象
接手的大型SQL Server存储过程在DBeaver中运行时,反复出现“;”附近语法错误:删一个分号仍报错,删两个分号又提示“MERGE语句必须以分号结尾”,但脚本在其他环境可正常运行。
核心原因
问题出在DBeaver对SQL Server语句分隔符的处理逻辑上——SQL Server原生用GO作为批处理分隔符,而DBeaver默认可能将分号识别为批处理分隔符,导致脚本解析混乱。
解决方法
1. 修改DBeaver连接的语句分隔符设置
- 找到对应的SQL Server连接,右键选择「编辑连接」→「驱动属性」
- 找到
sql.query.separator选项,将其值改为GO(默认可能是分号) - 保存设置后重新运行脚本
2. 调整脚本的批处理分隔方式
在MERGE语句和WITH语句之间添加GO,明确拆分两个批处理,同时修正MERGE语句里的多余逗号:
MERGE rds.DimAuthorizers AS trgt USING #TmpAuthorizers AS src ON trgt.AuthOrgID = src.AuthOrgID AND ISNULL(trgt.StartTime, '') = ISNULL(src.StartTime, '') WHEN MATCHED THEN UPDATE SET trgt.AuthOrgName = src.AuthOrgName WHEN NOT MATCHED BY TARGET THEN INSERT (AuthOrgName) VALUES (src.AuthOrgName); GO WITH upd AS ( SELECT AuthOrgID , StartTime , min(endd.StartTime) - 1 AS EndTime FROM rds.DimAuthorizers startd JOIN rds.DimAuthorizers endd ON startd.AuthOrgID = endd.AuthOrgID AND startd.StartTime < endd.StartTime GROUP BY startd.AuthOrgID, startd.StartTime ) UPDATE da SET EndTime = upd.EndTime FROM rds.DimAuthorizers da JOIN upd ON da.AuthOrgID = upd.AuthOrgID AND da.StartTime = upd.StartTime
3. 临时应急方案
如果不想修改连接设置,可以分块选中脚本运行:先选中MERGE语句块执行,再选中WITH语句块执行,避免DBeaver将整个脚本当成单一语句解析。
内容的提问来源于stack exchange,提问作者data princess
相关产品推荐
相关产品推荐

