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.
Isso parece ser um problema com o inlining UDF. Como sugeriu @ScottHodgin, a primeira etapa é instalar a CU mais recente para verificar se o problema persiste. Se isso não resolver o problema, suas opções são:
Desligue
TSQL_SCALAR_UDF_INLINING
para o banco de dados:Adicione
INLINE OFF
ao cabeçalho da função do problema. Isso permitirá os benefícios do inlining escalar para outras funções.Refatore a consulta do problema para evitar o erro.
Acabei de chamar sp_recompile para todas as funções e funcionou bem.
Eu enfrentei esse mesmo problema quando mudei do SQL Server 2014 para 2019. Depois de alterar a opção de banco de dados "Nível de compatibilidade" para 150 (SQL 2019) os erros começaram a aparecer.