我们在 SQL Server 2016 数据库中有一些已经投入生产一段时间的 SQL 代码;但在重新启动 SQL Server 后的第一个小时左右(从 5-10 分钟到一个小时或更长时间,可能取决于 SQL Server 中的活动级别),它会在 SQL Server 2019 数据库中引发错误。错误是 CTE(公用表表达式)的“对象名称无效”。
我们在 SQL Server 2016 中有一个包含多个数据库的生产环境。我们现在已经使用 SQL Server 2019(在 Windows Server 2016 机器上,具有 24GB 的 RAM 和 4 个 CPU 内核)设置了一个新的开发/测试环境,以便我们可以进行测试使用 SQL Server 2019。此测试服务器上的数据库是从生产备份中恢复的生产数据库副本。测试环境中的所有数据库的兼容级别都设置为 150(SQL Server 2019)。
每天清晨,我们开始看到一些使用 CTE 的函数存在一些问题,这些函数会引发如下错误:
SqlException (0x80131904): Invalid object name 'CTEuniqueName'.]
Msg 208, Level 16, State 1, Procedure ufn_FunctionName, Line 28 [Batch Start Line 0]
Invalid object name 'CTEuniqueName'.
Run Code Online (Sandbox Code Playgroud)
错误在短时间内停止发生,直到第二天早上才再次发生。
错误发生在一对一个接一个调用的存储过程中,它们都调用了相同的(用户定义的 SQL)函数。通过一些测试,我了解到有时只需调用该函数,然后仅从该函数执行一段代码,就可能导致相同的错误。
我还发现,通过重新启动 SQL Server 实例并调用函数或代码块,我可能会持续导致错误。这可能也是它只在清晨失败的原因 …