Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如果条件在SQL函数中不起作用,则返回语句_Sql Server_User Defined Functions_Sql Server 2019 - Fatal编程技术网

Sql server 如果条件在SQL函数中不起作用,则返回语句

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(

如果可转换,我有以下函数将字符串转换为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
我必须在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