【问题标题】:Can CONTAINS Handle Table Columns that have NULL values?CONTAINS 可以处理具有 NULL 值的表列吗?
【发布时间】:2016-04-24 05:38:56
【问题描述】:

我正在尝试提高查询性能,并且与使用 LIKE 相比,我一直在研究应用 FULLTEXT INDEX。

我有一个包含个人信息的数据库,即 FirstName、LastName 等,其中一些列为空。

当我尝试使用 CONTAINS 对象时,我收到此错误消息;

Null or empty full-text predicate

我已经输入了代码来确保传入的@FirstName 字段不为空,如果传入了空值,那么我将其设置为'""',就像我在其他地方读到的那样。我仍然收到错误消息。我开始怀疑这是否是一个问题,因为索引的列是空的。

有人知道是不是这样吗,我到处找了,找不到任何信息。

这里是查询。 @FirstNameLocal 和@LastNameLocal 被传递到这个存储过程中。在此示例中,PersonTable 中的 FirstName 和/或 LastName 字段数据可能为空。我正在使用带有 SP1 的 SQL Server 2012。 “尝试使用”是指当我尝试在 SQL Management Studio 中运行查询时。

SELECT DISTINCT LastName, FirstName, MiddleName, PersonId
FROM PersonTable
Where IsDeleted = 0
AND CONTAINS(FirstName, @FirstNameLocal)
AND CONTAINS(LastName, @LastNameLocal)

【问题讨论】:

  • 向我们展示您当前的查询
  • 还请:“尝试使用”是什么意思?编译?跑步?给我们您的 SQL Server 版本和表定义。如果适用,示例输入和输出以及所需的输出。了解 MVCE。
  • 我的回答对您有帮助吗?我没有看到赞成或接受我的答案...只是想知道。

标签: sql sql-server


【解决方案1】:

您可以先检查您的变量是 NULL 还是等于空字符串。我认为这会部分抵消全文索引的好处,您应该考虑以不同的方式处理它(例如使用动态 SQL)。

SELECT DISTINCT LastName, FirstName, MiddleName, PersonId
FROM PersonTable
Where IsDeleted = 0
AND (ISNULL(@FirstNameLocal,'')='' OR CONTAINS(FirstName, @FirstNameLocal))
AND (ISNULL(@LastNameLocal,'')='' OR CONTAINS(LastName, @LastNameLocal));

如果您要使用动态 SQL 执行此操作,它会如下所示:

DECLARE @stmt NVARCHAR(4000);

SET @stmt=
    N'SELECT DISTINCT LastName, FirstName, MiddleName, PersonId ' +
    N'FROM PersonTable ' +
    N'Where IsDeleted = 0' +
    CASE WHEN ISNULL(@FirstNameLocal,'')='' 
        THEN N''
        ELSE N' AND CONTAINS(FirstName, @FirstNameLocal)'
    END +
    CASE WHEN ISNULL(@LastNameLocal,'')='' 
        THEN N''
        ELSE N' AND CONTAINS(LastName, @LastNameLocal)'
    END + ';'

EXEC sp_executesql 
    @stmt,
    N'@FirstNameLocal VARCHAR(256),@LastNameLocal VARCHAR(256)',
    @FirstNameLocal,
    @LastNameLocal;

缺点是每次运行此脚本时都会再次编译该语句,但与可在该语句中使用的全文索引的好处相比,这将是很小的。

始终比较 Actual Execution Plans 以选择最佳版本。

【讨论】:

  • 你能举个例子说明你的意思是用动态 sql 处理它吗?
  • @RobStewart 添加示例
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-20
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
相关资源
最近更新 更多