2

下面的 SQL 应该演示我正在尝试做的事情。不幸的是,当我尝试运行它时,我收到一条错误消息“Null or empty full-text predicate”。

DECLARE 
    @essaySearchTerm varchar(100), 
    @game_id varchar(100)
SET @essaySearchTerm = NULL; 
SET @game_id = 2; 

SELECT * FROM tblImageInfo i
WHERE i.game_id = @game_id 
        AND (@essaySearchTerm IS NULL OR CONTAINS(i.essay, @essaySearchTerm))

这个错误是什么意思?我怎样才能解决这个问题?

4

2 回答 2

3

这是因为 SQL Server 运算符不能保证短路,所以如果你有一个表达式'A OR B',有时 A 和 B 都将被计算而不管 A 的逻辑值。参见这篇文章这篇文章了解更多信息细节。

在您的情况下,当 @essaySearchTerm 为空时,它会尝试评估CONTAINS(i.essay, NULL),这是非法的。将代码更改为:

IF ISNULL(@essaySearchTerm, '') = ''
SET @essaySearchTerm = '""';

SELECT * FROM tblImageInfo i
WHERE i.game_id = @game_id 
  AND (@essaySearchTerm = '""' OR CONTAINS(i.essay, @essaySearchTerm))

OR 的右侧将是一个合法表达式,因为它CONTAINS(x, '""')返回一个空集。

于 2013-04-27T22:28:13.980 回答
0

如果其值为空或为空,则将其值设置@essaySearchTerm为(两个双引号):""

if @essaySearchTerm is null
set @essaySearchTerm='""';
于 2013-04-26T20:03:01.937 回答