CONTAINS可以处理具有NULL值的表列吗?

时间:2016-01-18 22:17:27

标签: sql sql-server

我正在尝试进行一些查询性能,与使用LIKE相比,我一直在研究应用FULLTEXT INDEX。

我有一个数据库w / person信息,即FirstName,LastName等,其中一些列为null。

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

Null or empty full-text predicate

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

有谁知道是否是这种情况,我到处寻找,我找不到任何相关信息。

这是查询。 @FirstNameLocal和@LastNameLocal将传递到此存储过程。在此示例中,PersonTable中的FirstName和/或LastName字段数据可以为null。我正在使用SQL Server 2012 w / SP1。 “尝试使用”表示我尝试在SQL Management Studio中运行查询时。

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

1 个答案:

答案 0 :(得分:0)

您可以先检查变量是否为空或等于空字符串。我认为这会部分地否定全文索引的好处,你应该考虑以不同的方式处理它(例如使用动态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以选择最适合的版本。