繁体   English   中英

Liquibase 格式化 SQL 和 SQL 服务器存储过程

[英]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. 从脚本中删除 SQLCMD 语句(如下所示),或者
  2. 在 Liquibase 中使用 SQLCMD 选项,以便您可以执行原始 SQLCMD 脚本

选项1

要通过 JDBC 运行此脚本,您需要:

  • 从格式化的 SQL 变更日志中删除 SQLCMD 语句

您还可以简化变更集属性:

  • 设置 splitStatements:false(最佳实践:每个变更集仅使用一个 CREATE PROCEDURE)
  • 删除 endDelimiter 因为你设置了 splitStatements:false
  • 删除 logicalFilePath,因为它只在更高级的用例中需要。
  • 删除 failOnError:true 因为这是默认设置
  • 删除 runOnChange:true 除非您希望在 CREATE PROCEDURE 更改时让 liquibase 重新运行此变更集。 如果你想这样做,那么你需要将 SQL 更改为“创建或替换”

这是您更新的变更日志:

--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 或改用重构标记。

文档:

  1. https://docs.liquibase.com/change-types/create-procedure.html
  2. https://docs.liquibase.com/change-types/sql.html
  3. https://docs.liquibase.com/change-types/sql-file.html
  4. https://docs.liquibase.com/concepts/changelogs/attributes/enddelimiter-sql-attribute.html

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM