我遇到了Server的问题,导致它无限地重新编译一个函数。
若要进行复制,请在现有DB上创建一个具有Parameterization =强制或执行以下选项的新数据库:
ALTER DATABASE [DatabaseName] SET PARAMETERIZATION FORCED WITH NO_WAIT然后执行以下脚本:
CREATE TABLE dbo.TestTable(
ID int IDENTITY(1,1) NOT NULL,
FullTextField varchar(100) NULL,
CONSTRAINT PK_TestTable PRIMARY KEY CLUSTERED
(ID ASC)
)
GO
IF NOT EXISTS(SELECT 1 FROM sysfulltextcatalogs WHERE name = 'FullTextCat')
CREATE FULLTEXT CATALOG FullTextCat;
GO
CREATE FULLTEXT INDEX ON dbo.TestTable (FullTextField) KEY INDEX PK_TestTable
ON FullTextCat
WITH
CHANGE_TRACKING AUTO
GO
CREATE OR ALTER FUNCTION dbo.fn_TestFullTextSearch(@Filter VARCHAR(8000))
RETURNS TABLE
AS
RETURN SELECT
ID,
FullTextField
FROM dbo.TestTable
WHERE CONTAINS(FullTextField, @Filter)
GO
SELECT * FROM dbo.fn_TestFullTextSearch('"a*"')查询将永远不会返回。运行SQLHANDLE来监视SP:CacheInsert和SP:CacheRemove将显示SQL服务器正在无休止地执行此操作,并且SQL日志将显示无数条“为SQLHANDLE检测到无限重编译”的消息。
围绕这个问题设置Parameterization = Simple,但由于其他原因,我们需要将其设置为强制。
以前有没有人遇到过这个问题和/或有一个建议的解决方案?
谢谢,
卡盘
发布于 2022-01-20 22:14:42
虽然我仍然遇到了我提供的原始代码的问题,但是通过使用@Martin's approach显式地参数化函数调用,我还是会遇到这个问题:
EXEC sys.sp_executesql N'SELECT * FROM dbo.fn_TestFullTextSearch(@Filter)', N'@Filter VARCHAR(4)', @Filter = '"a*"'我已经成功地解决了这个问题。
https://stackoverflow.com/questions/70776114
复制相似问题