首页 > 解决方案 > 升级到 2019 后的 SQL 标量函数 msg 107

问题描述

我有一个非常简单的标量函数,代码如下:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER FUNCTION [dbo].[GetNDate_YYYYMM] 
(
        @InputDate DATETIME
)
RETURNS INT
AS
BEGIN
    DECLARE @RIS AS INT
    SET @RIS=NULL
    IF (@InputDate IS NOT NULL) SET @RIS=(YEAR(@InputDate)*100)+(MONTH(@InputDate))
USCITA:
    RETURN @RIS
END

此函数在 SQL 2012 中已经工作多年,但现在我已将该函数迁移到 SQL 2019,我收到以下消息:

Msg 107, Level 15, State 1, Procedure GetNDate_YYYYMM, Line 1 [Batch Start Line 0]
The column prefix 'DT0' does not match with a table name or alias name used in the query.

实际上,如果我从 SQL 管理工作室(而不是在我第一次注意到问题的存储过程期间)对此函数运行选择,我只会在第一次运行时收到此消息,然后直到我重新连接到数据库。

谢谢你的帮助,詹姆斯

标签: tsqlsql-server-2012sql-server-2019

解决方案


这看起来像是 2019 RTM 中的标量 UDF 内联错误,已在某些累积更新中修复(很可能是 CU2,因为它修复了以下问题并且您有这样的标签)

没有关联 GOTO 命令的 UDF 引用标签返回不正确的结果(在 Microsoft SQL Server 2019 CU2 中添加)

看起来像是一些内部错误被错误地返回给客户端,但实际上并未被视为错误。

对于以下 SQL

BEGIN TRY
SELECT [dbo].[GetNDate_YYYYMM]('1900-01-01') AS FunctionResult
OPTION (RECOMPILE)

SELECT 'After UDF' AS Message

END TRY
BEGIN CATCH
SELECT 'In Catch' AS Message
END CATCH

选择“结果到文本”的输出是

Msg 107, Level 15, State 1, Procedure GetNDate_YYYYMM, Line 1 [Batch Start Line 21]
The column prefix 'DT0' does not match with a table name or alias name used in the query.
Msg 107, Level 15, State 1, Procedure GetNDate_YYYYMM, Line 1 [Batch Start Line 21]
The column prefix 'DT0' does not match with a table name or alias name used in the query.
FunctionResult
--------------
190001

Message
---------
After UDF

因此,在错误消息成功返回函数结果并继续执行而没有CATCH到达块。

一些可能的解决方案

  • 删除问题标签 ( USCITA:)
  • 添加INLINE=OFF到函数以禁用内联
  • 升级到最新的 CU 以获得最新的错误修复

推荐阅读