【问题标题】:SQL Function Stuck and Will Not Return ValueSQL 函数卡住并且不会返回值
【发布时间】:2020-07-14 04:15:36
【问题描述】:

我有一个相当简单的函数,它接受一个字符串,检查值并替换它们,并在所有替换后返回结果字符串。没有循环或任何东西。

但是,当我运行它时,它就像卡在一个循环中一样坐在那里,不会返回任何值。

这里是有问题的函数:

ALTER FUNCTION [dbo].[fn_DeNormalizeCo] (@oldStr varchar(255))
    RETURNS varchar(255)
BEGIN
    DECLARE 
        @newStr varchar(255)

    SET @newStr = LTRIM(RTRIM(@oldStr))

    -- Tab  \t
    IF (@newStr LIKE '%'+CHAR(9)+'%')
        SET @newStr = REPLACE(@newStr, CHAR(9), '')
    
    -- Linefeed \n
    IF (@newStr LIKE '%'+CHAR(10)+'%')
        SET @newStr = REPLACE(@newStr, CHAR(10), '')
    
    -- Carriage Return \r
    IF (@newStr LIKE '%'+CHAR(13)+'%')
        SET @newStr = REPLACE(@newStr, CHAR(13), '')

    -- °
    IF (@newStr LIKE '%'+CHAR(176)+'%')
        SET @newStr = REPLACE(@newStr, CHAR(176), '')
    
    IF (@newStr LIKE '%#%')
        SET @newStr = REPLACE(@newStr, '#', '')

    IF (@newStr LIKE '%:%')
        SET @newStr = REPLACE(@newStr, ':', '')

    IF (@newStr LIKE '%;%')
        SET @newStr = REPLACE(@newStr, ';', '')

    IF (@newStr LIKE '%@%')
        SET @newStr = REPLACE(@newStr, '@', '')

    IF (@newStr LIKE '%[%]%')
        SET @newStr = REPLACE(@newStr, '%', '')

    IF (@newStr LIKE '%*%')
        SET @newStr = REPLACE(@newStr, '*', '')

    IF (@newStr LIKE '%&%')
        SET @newStr = REPLACE(@newStr, '&', '')

    IF (@newStr LIKE '%!%')
        SET @newStr = REPLACE(@newStr, '!', '')

    IF (@newStr LIKE '%$%')
        SET @newStr = REPLACE(@newStr, '$', '')

    IF (@newStr LIKE '%"%')
        SET @newStr = REPLACE(@newStr, '"', '')

    IF (@newStr LIKE '%''%')
        SET @newStr = REPLACE(@newStr, '''', '')

    

    IF (@newStr LIKE '%,INC.%')
        SET @newStr = REPLACE(@newStr, ',INC.', '')

    IF (@newStr LIKE '%,INC%')
        SET @newStr = REPLACE(@newStr, ',INC', '')

    IF (@newStr LIKE '%, INC.%')
        SET @newStr = REPLACE(@newStr, ', INC.', '')

    IF (@newStr LIKE '%, INC%')
        SET @newStr = REPLACE(@newStr, ', INC', '')

    IF (@newStr LIKE '% INC.')
        SET @newStr = REPLACE(@newStr, ' INC.', '')

    IF (@newStr LIKE '% INC')
        SET @newStr = REPLACE(@newStr, ' INC', '')


    IF (@newStr LIKE '%,LLC.%')
        SET @newStr = REPLACE(@newStr, ',LLC.', '')

    IF (@newStr LIKE '%,LLC%')
        SET @newStr = REPLACE(@newStr, ',LLC', '')

    IF (@newStr LIKE '%, LLC.%')
        SET @newStr = REPLACE(@newStr, ', LLC.', '')

    IF (@newStr LIKE '%, LLC%')
        SET @newStr = REPLACE(@newStr, ', LLC', '')

    IF (@newStr LIKE '%LLC.')
        SET @newStr = REPLACE(@newStr, ' LLC.', '')

    IF (@newStr LIKE '% LLC')
        SET @newStr = REPLACE(@newStr, ' LLC', '')



    IF (@newStr LIKE '%,CO.%')
        SET @newStr = REPLACE(@newStr, ',CO.', '')

    IF (@newStr LIKE '%,CO%')
        SET @newStr = REPLACE(@newStr, ',CO', '')

    IF (@newStr LIKE '%, CO.%')
        SET @newStr = REPLACE(@newStr, ', CO.', '')

    IF (@newStr LIKE '%, CO%')
        SET @newStr = REPLACE(@newStr, ', CO', '')

    IF (@newStr LIKE '% CO.%') 
        SET @newStr = REPLACE(@newStr, ' CO.', '')

    IF (@newStr LIKE '% CO%') 
        SET @newStr = REPLACE(@newStr, ' CO', '')



    IF (@newStr LIKE '%,CORP.')
        SET @newStr = REPLACE(@newStr, ',CORP.', '')

    IF (@newStr LIKE '%,CORP')
        SET @newStr = REPLACE(@newStr, ',CORP', '')

    IF (@newStr LIKE '%, CORP.')

        SET @newStr = REPLACE(@newStr, ', CORP.', '')

    IF (@newStr LIKE '%, CORP')
        SET @newStr = REPLACE(@newStr, ', CORP', '')

    IF (@newStr LIKE '% CORP.')
        SET @newStr = REPLACE(@newStr, ' CORP.', '')

    IF (@newStr LIKE '% CORP')
        SET @newStr = REPLACE(@newStr, ' CORP', '')



    IF (@newStr LIKE '%,MFG.')
        SET @newStr = REPLACE(@newStr, ',MFG.', '')

    IF (@newStr LIKE '%,MFG')
        SET @newStr = REPLACE(@newStr, ',MFG', '')

    IF (@newStr LIKE '%, MFG.')
        SET @newStr = REPLACE(@newStr, ', MFG.', '')

    IF (@newStr LIKE '%, MFG')
        SET @newStr = REPLACE(@newStr, ', MFG', '')

    IF (@newStr LIKE '% MFG.')
        SET @newStr = REPLACE(@newStr, ' MFG.', '')

    IF (@newStr LIKE '% MFG')
        SET @newStr = REPLACE(@newStr, ' MFG', '')



    IF (@newStr LIKE '%,INCORPORATED.%')
        SET @newStr = REPLACE(@newStr, ',INCORPORATED.', '')

    IF (@newStr LIKE '%,INCORPORATED%')
        SET @newStr = REPLACE(@newStr, ',INCORPORATED', '')

    IF (@newStr LIKE '%, INCORPORATED.%')
        SET @newStr = REPLACE(@newStr, ', INCORPORATED.', '')

    IF (@newStr LIKE '%, INCORPORATED%')
        SET @newStr = REPLACE(@newStr, ', INCORPORATED', '')

    IF (@newStr LIKE '% INCORPORATED.')
        SET @newStr = REPLACE(@newStr, 'INCORPORATED.', '')

    IF (@newStr LIKE '% INCORPORATED')
        SET @newStr = REPLACE(@newStr, 'INCORPORATED', '')


    RETURN @newStr
END

我尝试了一个简单的电话:SELECT [ULTRA].[dbo].[fn_DeNormalizeCo]('Noname LLC')

为了排除我从另一个数据库调用函数的事实,我还使用 SELECT [dbo].[fn_DeNormalizeCo]('Noname LLC') 从 [ULTRA] 数据库中尝试了它,结果同样被卡住了。

我真的很茫然,我发誓在我必须擦除并重新加载我的电脑之前,我已经很好地使用了这个功能。

我正在使用:

  • SQL Server 2019 (v15.0.2070.41)
  • SSMS v18.5

【问题讨论】:

  • 您发布的代码中没有循环结构,因此 ULTRA.dbo.fn_DeNormalizeCo 必须包含不同的代码......甚至可能是从被打开事务阻塞的表中选择的代码。跨度>
  • SELECT [dbo].[fn_DeNormalizeCo]('Noname LLC') 语句是批处理中唯一无法返回的语句吗? SQL中有编译锁这样的东西,但我在这里看不到任何会导致它被阻塞的东西。对这种特定锁类型有更多了解的人可能会对此进行权衡。不过,您可以在新窗口中运行sp_who2,以确保它没有(以某种方式??)被阻止。除此之外......你说你必须擦拭你的电脑?也许一个 dbcc checkdb 是有序的。您检查过 SQL 日志是否有任何令人担忧的事情?
  • 哦,既然您使用的是 SQL 2019,那么如果您的数据库兼容级别为 150 并启用了内联,那么可能也值得尝试 alter function [dbo].[fn_DeNormalizeCo] (@oldStr varchar(255)) returns varchar(255) with inline = OFF
  • 在进行所有替换之前确实没有理由使用like 进行测试。
  • @allmhuran 就是这样!我永远也想不通,谢谢。您可以将其发布为答案吗?

标签: sql sql-server function


【解决方案1】:

由于您使用的是 SQL Server 2019,因此可能值得一试

alter function [dbo].[fn_DeNormalizeCo] (@oldStr varchar(255)) 
returns varchar(255) 
with inline = OFF

.. 如果您的数据库兼容级别为 150 并启用了内联。

标量内联仍然存在缺陷。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-28
    • 1970-01-01
    • 2017-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-25
    相关资源
    最近更新 更多