gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 01:30:39 25 4
gpt4 key购买 nike

如果可转换,我有以下函数将字符串转换为 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 语句停止返回空值。因此我开始收到以下错误:

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

我必须在 If condition 之外添加一个 return 语句,以便从函数返回任何值.我该如何解决这个问题?

enter image description here

最佳答案

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

执行计划如下所示

enter image description here

传递给函数的值从右上角的常量扫描发出,别名为 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(或至少替换主体如果此时无法完全删除它,则使用该功能)

关于sql-server - If 条件中的 Return 语句在 SQL 函数中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61097432/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com