使用Liquibase执行SQL Server脚本失败求助
解决Liquibase执行SQL Server脚本时"Incorrect syntax near 'GO'"错误
问题根源
SQL Server的GO不是标准SQL语法,它是SSMS等工具的批处理分隔符,JDBC驱动无法直接识别。你的Liquibase配置错误地处理了GO,导致整个脚本被当作单条语句提交,触发语法错误。
正确配置方案
修改你的change.xml配置,针对SQL Server的批处理特性做如下调整:
<changeSet id="cnfxecute.dev.20240305-3" author="laxmi"> <sqlFile path="db/scripts/dev/2024/01/run-1.sql" splitStatements="true" stripComments="true" endDelimiter="GO" splitStatementsRegex="(?i)\bGO\b"/> </changeSet>
参数说明
splitStatements="true":允许Liquibase按指定分隔符拆分SQL批处理,让每个GO分隔的块单独执行endDelimiter="GO":明确指定批处理结束符为GOsplitStatementsRegex="(?i)\bGO\b":用正则精准匹配GO(不区分大小写,仅匹配单独的GO单词,避免误匹配包含GO的字符串)stripComments="true":移除SQL注释(如--或/* */),注意该参数取值是布尔值,不是具体字符串,之前设置为"GO"是错误用法
脚本优化建议
确保你的run-1.sql中GO是单独一行,无多余空格或字符:
USE [MyDB] GO BEGIN SET NOCOUNT ON; DECLARE @prmName VARCHAR(50)='Laxmi'; INSERT INTO tabletest1(name) SELECT @prmName END GO
为什么之前的尝试无效
splitStatements="false"会让Liquibase把整个脚本当作单条语句提交,JDBC无法识别GOstripComments="GO"是错误用法,该参数用于控制是否移除注释,不是处理批处理分隔符- 设置
endDelimiter=";"不符合你的脚本逻辑,因为你用GO作为批处理分隔符而非分号
内容的提问来源于stack exchange,提问作者Govind
相关产品推荐
相关产品推荐

