通过 Flyway 运行批处理脚本时出现 SQL 错误 586

Posted

技术标签:

【中文标题】通过 Flyway 运行批处理脚本时出现 SQL 错误 586【英文标题】:SQL Error 586 When running batch scripts through Flyway 【发布时间】:2018-11-11 01:16:57 【问题描述】:

我正在通过 flyway migrate 运行一些脚本,并且在每个脚本中都出现此错误。脚本本身会运行,但下一个不会。

The prepared statement handle 3 is not valid in this context.  
Please verify that current database, user default schema, and ANSI_NULLS and 
QUOTED_IDENTIFIER set options are not changed since the handle is prepared.

上次脚本运行良好,但我有一段时间没有执行它们。其他开发人员在笔记本电脑上运行良好。我检查了两台笔记本电脑上 ANSI_Nulls 和 Quoted_Identifier 的默认设置,它们是相同的。

需要注意的一点是,所有脚本在执行之前都将 ANSI_NULLS 和 QUOTED_IDENTIFIER 显式设置为 ON,然后例如将它们关闭

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS ON 
GO
IF OBJECT_ID(N'[dbo].[CalculateActionStatus]', N'FN') IS NULL
    EXEC('CREATE FUNCTION [dbo].[CalculateActionStatus] (@Dummy int) RETURNS int AS BEGIN RETURN 1 END;')
GO

ALTER FUNCTION [dbo].[CalculateActionStatus]
       (@ActionID int)
   RETURNS int 
AS
BEGIN
       -- Action Status is basically the BIGGEST Status value of its child steps

       DECLARE @Status  int
       set @Status = 0

       select @Status = max(dbo.CalculateStepStatus(Start, Due, Completed, PercentComplete))
       from dbo.view_Step_ResolutionStep
       where ActionID = @ActionID

       RETURN isnull(@Status, 0)
END

GO
SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

有什么想法吗?

【问题讨论】:

这可能是一个错误。请在问题跟踪器中提交问题,并提供如何重现的确切步骤,以及完整的堆栈跟踪和导致问题的迁移的 SQL。 你找到答案了吗? 【参考方案1】:

我遇到了这个问题,但这是因为我使用的是 JTDS 驱动程序。我改为使用 SQL 服务器驱动程序,它工作正常。这实际上在 Flyway SQL Server Limitations 文档中也有说明。

JTDS 连接字符串;

flyway.url=jdbc:jtds:sqlserver://myserver:1433/mydb

SQL Server 连接字符串;

flyway.url=jdbc:sqlserver://myserver:1433;databaseName=mydb

【讨论】:

以上是关于通过 Flyway 运行批处理脚本时出现 SQL 错误 586的主要内容,如果未能解决你的问题,请参考以下文章

使用 Flyway 在多个模式上运行 SQL 脚本

使用 Flyway 和 Docker 容器内的嵌入式 Postgresql 运行测试时出现 java.net.ConnectException

flyway迁移后运行data.sql文件

Management Studio 生成的 Sql 脚本在作为查询运行时出现错误

使用 Flyway 时出现 NoClassDefFoundError

Flyway 迁移无法识别 beforeValidate.sql