Sql server 如果条件在SQL函数中不起作用,则返回语句
如果可转换,我有以下函数将字符串转换为int:Sql server 如果条件在SQL函数中不起作用,则返回语句,sql-server,user-defined-functions,sql-server-2019,Sql Server,User Defined Functions,Sql Server 2019,如果可转换,我有以下函数将字符串转换为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(
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
我必须在If条件之外添加一个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
表达式最终采用哪条路径,这都会爆炸
这个问题看起来很相似。绿色高亮显示的常量扫描位于带有传递谓词的内部联接下,因此只有当ISNUMERIC
测试为true时,才会对其求值。常量扫描的输出列表是空的,所以我假设表达式很可能是从那里移动的,并且与链接的答案具有相同的错误逻辑
您可以使用
WITH INLINE=OFF
关闭该函数的内联功能,但您可能应该完全删除该函数,并用TRY\u CONVERT
替换它(或者如果此时无法完全删除函数体,则至少用该函数体替换它)您的输入值是多少?您可以尝试此SELECT dbo。[Dyve_FN_TryConvertInt]('63d9efcd')毫无疑问,scalar UDFsInstall的内联是一个bug,它很可能会修复这个bug。如果失败,您可以使用with INLINE=OFF
关闭内联。但无论如何,为什么不使用内置的try convert或try_parse函数呢?我也有同样的错误。我的sql server版本是sql 2019标准版,版本号是15.0。2000.xx。
[Expr1007]=CASE
WHEN CHARINDEX('.', [Expr1000]) > ( 0 )
THEN CONVERT(BIGINT, PARSENAME(CONVERT_IMPLICIT(nvarchar(18), [Expr1000], 0), ( 2 )), 0)
ELSE CONVERT(BIGINT, [Expr1000], 0)
END