tsql - 升级到 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 管理工作室(而不是在我第一次注意到问题的存储过程期间)对此函数运行选择,我只会在第一次运行时收到此消息,然后直到我重新连接到数据库。
谢谢你的帮助,詹姆斯
解决方案
这看起来像是 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 以获得最新的错误修复
推荐阅读
- android - Android Studio 和自动登录到一个页面
- c - argv[] 中的 int 参数
- xml - WiX 引导程序主题中的多图像广告牌
- php - 如何修改 DateTimeImmuable?
- powershell - Jq - 在 windows powershell 上运行时出现语法错误,但在 bash 终端上运行成功
- javascript - JavaScript如何更改图像onclick事件
- flutter - Flutter 从 REST API 创建 PDF
- python - 在python中精确切片一个3d数组
- python - 仅在 chromedriver 中单击键盘
- node.js - 尝试使用 local-web-server 运行节点服务器 - cli 模块返回“未定义”