Sql-Server

升級到 SQL Server 2019 後,一些儲存過程失敗

  • October 27, 2020

我們剛剛從 SQL Server 2008 R2 升級到 SQL Server 2019(Compability lvl 150)。

我們有兩個不同的儲存過程在升級後開始失敗,錯誤消息如下:

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.

真正奇怪的是,這個特殊的儲存過程不帶任何參數,當我們簡單地在 SSMS 中執行 SQL 程式碼的主體時,它工作正常(!?)。

什麼可能導致某些在 SSMS 中執行時執行良好的 SQL 程式碼在包裝在儲存過程中時突然開始失敗?

我們設法將錯誤與我們擁有的日期格式化功能隔離開來:

這在 SSMS 中執行時有效:

select dbo.fn_formatdatetime(DATEADD(month, -6, GETDATE()), 'yyyy-mm')
output:
(No column name)
2019-12

但是當在 testproc 中呼叫時,它會失敗:

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.

這看起來是 UDF 內聯的問題。正如@ScottHodgin 建議的那樣,第一步是安裝最新的 CU 以查看問題是否仍然存在。如果這不能解決問題,您的選擇是:

  1. 關閉TSQL_SCALAR_UDF_INLINING數據庫:
USE YourDatabase;
ALTER DATABASE SCOPED CONFIGURATION SET TSQL_SCALAR_UDF_INLINING = OFF;
  1. 添加INLINE OFF到問題函式標題。這將為其他函式帶來標量內聯的好處。
  2. 重構問題查詢以避免錯誤。

引用自:https://dba.stackexchange.com/questions/269395