我正在尝试进行一些查询性能,与使用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)
答案 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以选择最适合的版本。