包含方法的可选搜索参数

时间:2013-04-26 19:54:30

标签: sql sql-server sql-server-2008 tsql

以下SQL应该展示我想要做的事情。不幸的是,当我尝试运行它时,我收到一条错误,上面写着“空或全空谓词”。

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))

这个错误是什么意思? 我该如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

这是因为不保证SQL Server运算符会被短路,所以如果你有一个表达式'A OR B',有时A和B都会被评估,无论A的逻辑值如何。见{{3或者post了解更多详情。

在您的情况下,当@essaySearchTerm为null时,它会尝试评估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, '""')返回一个空集。

答案 1 :(得分:0)

@essaySearchTerm的值设置为""(两个双引号),如果它为null或为空:

if @essaySearchTerm is null
set @essaySearchTerm='""';