[英]Liquibase Formatted SQL and SQL Server Stored Procedures
我的团队正在尝试让 Liquibase 格式的 SQL 与 SQL Server Enterprise 一起使用。 我们创建表没有问题,但是每当我们尝试创建存储过程时,我们都会遇到解析错误。
这是我们的脚本:
--liquibase formatted sql
--changeset <AUTHOR>:<ID> logicalFilePath:<MY_PATH> dbms:mssql failOnError:true splitStatements:true runOnChange:true endDelimiter:;
USE [test_db]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [test_schema].[test_proc]
@grgr_ck NVARCHAR(30) = NULL,
@cspi_id NVARCHAR(30) = NULL,
@nwst_pfx NVARCHAR(30) = NULL,
@cscs_id NVARCHAR(30) = NULL,
@cspi_eff_dt NVARCHAR(30) = NULL
AS
SELECT GRGR_CK,
GRGR_ID,
CSCS_ID,
CSPI_ID,
CSPI_EFF_DT = CONVERT(CHAR(10),CSPI_EFF_DT,101),
CECN_EFF_DT = CONVERT(CHAR(10),CECN_EFF_DT,101),
CECN_TERM_DT = CONVERT(CHAR(10),CECN_TERM_DT,101),
ECN_ID,
NWST_PFX,
INSERT_DT = CONVERT(CHAR(10),INSERT_DT,101),
LAST_UPD_BY,
LAST_UPD_DT = CONVERT(CHAR(10),LAST_UPD_DT,101)
FROM test_schema.test_table
WHERE GRGR_CK =
(
SELECT CONVERT(INT, @grgr_ck)
)
AND CSPI_ID = @cspi_id
AND NWST_PFX = @nwst_pfx
AND CSCS_ID = @cscs_id
AND CSPI_EFF_DT =
(
SELECT CONVERT(DATETIME, @cspi_eff_dt)
)
AND CECN_TERM_DT < '12/31/9999';
这是错误:
[错误] 原因:liquibase.exception.DatabaseException:'12/31/9999' 附近的语法不正确。
分号每次都会打断它。 我们尝试过使用其他分隔符,例如 \,但这些分隔符也没有用。 谁能告诉我们使用 Liquibase 格式的 SQL 在 SQL 服务器中创建存储过程的正确方法? (作为记录,我们能够使用 Liquibase XML 文件创建过程,但我们的开发人员希望使用“纯”SQL)
您的脚本包含 SQLCMD 语句(“USE”、“SET ANSI_NULLS”和“SET QUOTED_IDENTIFIER”)。
由于 Liquibase 通过 JDBC 执行,因此 SQLCMD 语句不会通过该路径执行。
有两种选择:
选项1
要通过 JDBC 运行此脚本,您需要:
您还可以简化变更集属性:
这是您更新的变更日志:
--liquibase formatted sql
--changeset MyName:ID-00001 splitStatements:false dbms:mssql
CREATE PROCEDURE [test_schema].[test_proc]
@grgr_ck NVARCHAR(30) = NULL,
@cspi_id NVARCHAR(30) = NULL,
@nwst_pfx NVARCHAR(30) = NULL,
@cscs_id NVARCHAR(30) = NULL,
@cspi_eff_dt NVARCHAR(30) = NULL
AS
SELECT GRGR_CK,
GRGR_ID,
CSCS_ID,
CSPI_ID,
CSPI_EFF_DT = CONVERT(CHAR(10),CSPI_EFF_DT,101),
CECN_EFF_DT = CONVERT(CHAR(10),CECN_EFF_DT,101),
CECN_TERM_DT = CONVERT(CHAR(10),CECN_TERM_DT,101),
ECN_ID,
NWST_PFX,
INSERT_DT = CONVERT(CHAR(10),INSERT_DT,101),
LAST_UPD_BY,
LAST_UPD_DT = CONVERT(CHAR(10),LAST_UPD_DT,101)
FROM test_schema.test_table
WHERE GRGR_CK =
(
SELECT CONVERT(INT, @grgr_ck)
)
AND CSPI_ID = @cspi_id
AND NWST_PFX = @nwst_pfx
AND CSCS_ID = @cscs_id
AND CSPI_EFF_DT =
(
SELECT CONVERT(DATETIME, @cspi_eff_dt)
)
AND CECN_TERM_DT < '12/31/9999';
看起来您将 splitStatements 设置为 true,这会导致 SQL 自动拆分您的查询; 和 GO。在这种情况下,这不是您想要的。
您可以将属性 splitStatements 设置为 false 或改用重构标记。
文档:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.