以下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))
这个错误是什么意思? 我该如何解决这个问题?
答案 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='""';