Acabamos de atualizar do SQL Server 2008 R2 para o SQL Server 2019 (Compability lvl 150).
Temos dois procedimentos armazenados diferentes que começaram a falhar após a atualização, com mensagens de erro como esta:
Msg 8632, Level 17, State 2, Procedure BuildSelfSaleStats, Line 14 [Batch Start Line 4]
Internal error: An expression services limit has been reached. Please look for potentially complex expressions in your query, and try to simplify them.
O que é realmente estranho é que esse procedimento armazenado em particular não recebe nenhum argumento e, quando simplesmente executamos o corpo do código SQL no SSMS, ele funciona bem (!?).
O que pode fazer com que algum código SQL que funcione bem quando executado no SSMS comece a falhar repentinamente quando estiver envolvido em um procedimento armazenado?
Conseguimos isolar o erro para uma função de formatação de data que tínhamos:
Isso funciona quando executado no SSMS:
select dbo.fn_formatdatetime(DATEADD(month, -6, GETDATE()), 'yyyy-mm')
output:
(No column name)
2019-12
Mas quando chamado no testproc, ele falha:
CREATE PROCEDURE testproc
AS
BEGIN
SET NOCOUNT ON;
select dbo.fn_formatdatetime(DATEADD(month, -6, GETDATE()), 'yyyy-mm')
END
exec testproc
Msg 8632, Level 17, State 2, Procedure testproc, Line 9 [Batch Start Line 11]
Internal error: An expression services limit has been reached. Please look for potentially complex expressions in your query, and try to simplify them.