首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Server 2019无限地重新编译行内表值函数,该函数使用参数化=强制进行全文搜索

Server 2019无限地重新编译行内表值函数,该函数使用参数化=强制进行全文搜索
EN

Stack Overflow用户
提问于 2022-01-19 18:43:14
回答 1查看 130关注 0票数 2

我遇到了Server的问题,导致它无限地重新编译一个函数。

若要进行复制,请在现有DB上创建一个具有Parameterization =强制或执行以下选项的新数据库:

代码语言:javascript
复制
ALTER DATABASE [DatabaseName] SET PARAMETERIZATION FORCED WITH NO_WAIT

然后执行以下脚本:

代码语言:javascript
复制
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,但由于其他原因,我们需要将其设置为强制。

以前有没有人遇到过这个问题和/或有一个建议的解决方案?

谢谢,

卡盘

EN

回答 1

Stack Overflow用户

发布于 2022-01-20 22:14:42

虽然我仍然遇到了我提供的原始代码的问题,但是通过使用@Martin's approach显式地参数化函数调用,我还是会遇到这个问题:

代码语言:javascript
复制
EXEC sys.sp_executesql N'SELECT * FROM dbo.fn_TestFullTextSearch(@Filter)', N'@Filter VARCHAR(4)', @Filter = '"a*"'

我已经成功地解决了这个问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70776114

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档