I asked this question here previously: https://social.msdn.microsoft.com/Forums/en-US/7d6df408-4c65-42f4-9666-2db0623100f8/nonyielding-scheduler-on-sql-server-2019?forum=sqldatabaseengine
However the answer indicated it would likely be fixed in CU2... it's now CU5 and we still have the same issue.
Repro here:
CREATE FUNCTION [dbo].[fn_remove_nonstandard_characters]
(
@p_string_to_cleanse varchar(1000)
)
RETURNS varchar(1000)
AS
--===============================================================================
-- removes nonstandard characters from string (except commas and dashes)
--===============================================================================
BEGIN
DECLARE @v_nonstandard_character_mask varchar(110)
SET @v_nonstandard_character_mask = '%[!?\"$.;:*#()@\\]%'
WHILE @p_string_to_cleanse LIKE @v_nonstandard_character_mask
BEGIN
SET @p_string_to_cleanse = LEFT( @p_string_to_cleanse,
PATINDEX( @v_nonstandard_character_mask,
@p_string_to_cleanse )-1 )
+ REVERSE( LEFT( REVERSE( @p_string_to_cleanse),
LEN( @p_string_to_cleanse ) -
PATINDEX( @v_nonstandard_character_mask, @p_string_to_cleanse )))
END
--===============================================================================
-- removes commas and dashes characters from string
--===============================================================================
IF @p_string_to_cleanse LIKE '%,%'
SET @p_string_to_cleanse = REPLACE( @p_string_to_cleanse, ',', '' )
IF @p_string_to_cleanse LIKE '%-%'
SET @p_string_to_cleanse = REPLACE( @p_string_to_cleanse, '-', '' )
IF @p_string_to_cleanse LIKE '%''%'
SET @p_string_to_cleanse = REPLACE( @p_string_to_cleanse, '''', '' )
IF @p_string_to_cleanse LIKE '%~[%' ESCAPE '~'
SET @p_string_to_cleanse = REPLACE( @p_string_to_cleanse, '[', '' )
IF @p_string_to_cleanse LIKE '%]%'
SET @p_string_to_cleanse = REPLACE( @p_string_to_cleanse, ']', '' )
IF @p_string_to_cleanse LIKE '%`%'
SET @p_string_to_cleanse = REPLACE( @p_string_to_cleanse, '`', '' )
RETURN @p_string_to_cleanse
END
CREATE FUNCTION [dbo].[fn_pack_legal_name]
(
@p_legal_name varchar(1000)
, @p_max_return_length integer
)
RETURNS varchar(1000)
AS
--===============================================================================
-- removes the following terms from employer_name
-- AND, MANAGEMENT, LTD, LIMITED, GROUP, COMPANY, CO, DIVISION, NEW ZEALAND, NZ, MR, MRS
--===============================================================================
BEGIN
SET @p_legal_name = dbo.fn_remove_nonstandard_characters( @p_legal_name )
IF @p_legal_name LIKE '% AND%'
SET @p_legal_name = REPLACE( @p_legal_name, ' AND', ' ' )
IF @p_legal_name LIKE '% MANAGEMENT%'
SET @p_legal_name = REPLACE( @p_legal_name, ' MANAGEMENT', ' ' )
IF @p_legal_name LIKE '% LTD%'
SET @p_legal_name = REPLACE( @p_legal_name, ' LTD', ' ' )
IF @p_legal_name LIKE '% LIMITED%'
SET @p_legal_name = REPLACE( @p_legal_name, ' LIMITED', ' ' )
IF @p_legal_name LIKE '% GROUP%'
SET @p_legal_name = REPLACE( @p_legal_name, ' GROUP', ' ' )
IF @p_legal_name LIKE '% COMPANY%'
SET @p_legal_name = REPLACE( @p_legal_name, ' COMPANY', ' ' )
IF @p_legal_name LIKE '% CO %'
SET @p_legal_name = REPLACE( @p_legal_name, ' CO ', ' ' )
IF @p_legal_name LIKE '% DIVISION%'
SET @p_legal_name = REPLACE( @p_legal_name, ' DIVISION', ' ' )
IF @p_legal_name LIKE '%NEW ZEALAND%'
SET @p_legal_name = REPLACE( @p_legal_name, 'NEW ZEALAND', ' ' )
IF @p_legal_name LIKE '% NZ%'
SET @p_legal_name = REPLACE( @p_legal_name, ' NZ', ' ' )
IF @p_legal_name LIKE '% MRS%'
SET @p_legal_name = REPLACE( @p_legal_name, ' MRS', ' ' )
IF @p_legal_name LIKE '% MR%'
SET @p_legal_name = REPLACE( @p_legal_name, ' MR', ' ' )
--lbf repair
IF @p_legal_name LIKE '% AN %'
SET @p_legal_name = REPLACE( @p_legal_name, ' AN ', ' ' )
IF @p_legal_name LIKE '% AS %'
SET @p_legal_name = REPLACE( @p_legal_name, ' AS ', ' ' )
IF @p_legal_name LIKE '% AT %'
SET @p_legal_name = REPLACE( @p_legal_name, ' AT ', ' ' )
IF @p_legal_name LIKE '% BY %'
SET @p_legal_name = REPLACE( @p_legal_name, ' BY ', ' ' )
IF @p_legal_name LIKE '% FOR %'
SET @p_legal_name = REPLACE( @p_legal_name, ' FOR ', ' ' )
IF @p_legal_name LIKE '% FROM %'
SET @p_legal_name = REPLACE( @p_legal_name, ' FROM ', ' ' )
IF @p_legal_name LIKE '% IN %'
SET @p_legal_name = REPLACE( @p_legal_name, ' IN ', ' ' )
IF @p_legal_name LIKE '% OF %'
SET @p_legal_name = REPLACE( @p_legal_name, ' OF ', ' ' )
IF @p_legal_name LIKE '% ON %'
SET @p_legal_name = REPLACE( @p_legal_name, ' OF ', ' ' )
IF @p_legal_name LIKE '% OR %'
SET @p_legal_name = REPLACE( @p_legal_name, ' OR ', ' ' )
IF @p_legal_name LIKE '% THE %'
SET @p_legal_name = REPLACE( @p_legal_name, ' THE ', ' ' )
IF @p_legal_name LIKE '% TO %'
SET @p_legal_name = REPLACE( @p_legal_name, ' TO ', ' ' )
IF @p_legal_name LIKE '% WITH %'
SET @p_legal_name = REPLACE( @p_legal_name, ' WITH ', ' ' )
IF @p_legal_name LIKE '% COMP %'
SET @p_legal_name = REPLACE( @p_legal_name, ' COMP ', ' ' )
IF @p_legal_name LIKE '% COMPAN %'
SET @p_legal_name = REPLACE( @p_legal_name, ' COMPAN ', ' ' )
IF @p_legal_name LIKE '% COMPANIES %'
SET @p_legal_name = REPLACE( @p_legal_name, ' COMPANIES ', ' ' )
IF @p_legal_name LIKE '% COMPANY %'
SET @p_legal_name = REPLACE( @p_legal_name, ' COMPANY ', ' ' )
IF @p_legal_name LIKE '% COMPNY %'
SET @p_legal_name = REPLACE( @p_legal_name, ' COMPNY ', ' ' )
IF @p_legal_name LIKE '% CORP %'
SET @p_legal_name = REPLACE( @p_legal_name, ' CORP ', ' ' )
IF @p_legal_name LIKE '% PTY %'
SET @p_legal_name = REPLACE( @p_legal_name, ' PTY ', ' ' )
IF @p_legal_name LIKE '% CORPORATION %'
SET @p_legal_name = REPLACE( @p_legal_name, ' CORPORATION ', ' ' )
IF @p_legal_name LIKE '% INC %'
SET @p_legal_name = REPLACE( @p_legal_name, ' INC ', ' ' )
IF @p_legal_name LIKE '% INCORP %'
SET @p_legal_name = REPLACE( @p_legal_name, ' INCORP ', ' ' )
IF @p_legal_name LIKE '% INCORPORATED %'
SET @p_legal_name = REPLACE( @p_legal_name, ' INCORPORATED ', ' ' )
IF @p_legal_name LIKE '% PROPRIETARY %'
SET @p_legal_name = REPLACE( @p_legal_name, ' PROPRIETARY ', ' ' )
IF @p_legal_name LIKE '% LMTD %'
SET @p_legal_name = REPLACE( @p_legal_name, ' LMTD ', ' ' )
IF @p_legal_name LIKE '% NL %'
SET @p_legal_name = REPLACE( @p_legal_name, ' NL ', ' ' )
SET @p_legal_name = UPPER( LEFT( REPLACE( @p_legal_name, ' ', '' ), @p_max_return_length) )
RETURN @p_legal_name
END
--Now lets run these functions using a simple table:
DROP TABLE IF EXISTS dbo.Function_calling_function
CREATE TABLE dbo.Function_calling_function (
ID int IDENTITY(1,1) PRIMARY KEY,
CompanyName varchar(300)
)
INSERT INTO dbo.Function_calling_function (CompanyName)
VALUES ('Microsoft software LMTD'),('Amazon shopping [.com] limited'),('Gillette, shaving foam limited'),('Facebook.com'),('New Zealand company inc'),('Xero'),('Some [],; Company')
--Try selecting everything, works a-ok
SELECT * FROM dbo.Function_calling_function
--Try non nested scalar function, works a-ok
SELECT *, [dbo].[fn_remove_nonstandard_characters](CompanyName) FROM dbo.Function_calling_function
--Try nested scalar function, seems to never end
SELECT *, [dbo].[fn_pack_legal_name](CompanyName,200) as CheckNestedFunc FROM dbo.Function_calling_function
I would prefer we didn't have to turn off Scalar UDF inlining per database, but that is what we have done. It's not an option to review the hundreds of calls to these functions and provide query hints or to selectively turn off the feature for certain
functions as we don't know what will/will not cause the bug. It seems to be related to nesting a "inlineable" function with a "non inlineable" function. Prefer it was fixed!