Return If 条件中的语句在 SQL 函数中不起作用

Return statement inside If condition does not work in SQL Functions

如果可转换,我有以下函数将字符串转换为 int:

CREATE FUNCTION dbo.[Dyve_FN_TryConvertInt](@Value varchar(18))
RETURNS int
AS
BEGIN
    SET @Value = REPLACE(@Value, ',', '')
    IF ISNUMERIC(@Value + 'e0') = 0 RETURN NULL
    IF ( CHARINDEX('.', @Value) > 0 AND CONVERT(bigint, PARSENAME(@Value, 1)) <> 0 ) RETURN NULL
    DECLARE @I bigint =
        CASE
        WHEN CHARINDEX('.', @Value) > 0 THEN CONVERT(bigint, PARSENAME(@Value, 2))
        ELSE CONVERT(bigint, @Value)
        END
    IF ABS(@I) > 2147483647 RETURN NULL
    RETURN @I
END
GO

升级到以下版本前后均有效

Microsoft SQL Server 2019 (RTM) - 15.0.2000.5 (X64) Sep 24 2019 13:48:23 Copyright (C) 2019 Microsoft Corporation Developer Edition (64-bit) on Windows 10 Pro 10.0 (Build 18362: ) (Hypervisor)

return 语句停止 return 空值,如果它不是数字的话。因此我开始收到以下错误:

Msg 8114, Level 16, State 5, Line 1 Error converting data type varchar
 to bigint.

我必须在 If 条件之外添加一个 return 语句 到 return 函数外的任何值。我该如何解决这个问题?

这是 SQL Server 2019 中标量 UDF 内联的错误。

执行计划如下

传递给函数的值从右上角的常量扫描发出,别名为Expr1000。这一直传递到最终到达包含以下表达式的计算标量

[Expr1007]=CASE
           WHEN CHARINDEX('.', [Expr1000]) > ( 0 )
             THEN CONVERT(BIGINT, PARSENAME(CONVERT_IMPLICIT(nvarchar(18), [Expr1000], 0), ( 2 )), 0)
           ELSE CONVERT(BIGINT, [Expr1000], 0)
         END 

在输入不是远程数字的情况下,无论 CASE 表达式最终采用哪条路径,这都会爆炸。

问题看起来与 the one here 相似。绿色突出显示的常量扫描位于具有传递谓词的内部连接下,因此只有在 ISNUMERIC 测试为真时才会被评估。该常量扫描的输出列表是空的,所以我假设表达式很可能是从那里移动的,并且具有与链接答案相同的错误逻辑。

您可以使用 WITH INLINE = OFF 关闭该函数的内联,但您可能应该完全删除它并替换为 TRY_CONVERT (或者至少用它替换函数体,如果它目前无法将其完全删除)