当变量有时为null或空字符串时,如何使用CONTAINS()?

时间:2012-03-26 14:53:13

标签: asp.net sql-server full-text-search contains

我有以下where子句:

B.GivenName=@GivenFirstName)  
or ((@GivenFirstName = '""') 
or  (@GivenFirstName is null)) 
or (B.GivenName like +'%'+ @GivenFirstName) 
or (B.GivenName like  @GivenFirstName + '%' )  
or (B.GivenName like + '%'+ @GivenFirstName + '%' ) 
or (CONTAINS(B.GivenName, @GivenFirstName,LANGUAGE 'german'))

如果未在搜索中输入名字,我会收到错误:

Msg 7645, Level 15, State 2, Procedure Search_test, Line 179
Null or empty full-text predicate.

我尝试在

中包装@GivenFirstName
COALESCE(@GivenFirstName, '""') 

但它也不起作用。

如果在where子句中@GivenFirstName为空,我可以使用@GivenFirstName OR'“”'吗?

谢谢, 托马斯

3 个答案:

答案 0 :(得分:2)

COALESCE应该为您做到这一点,但每个参数都应该有COALESCE(@GivenFirstName, '')(不带双引号)

我也不认为你需要所有这些条件。 CONTAINS应该为您做好一切。

你可以做WHERE CONTAINS(B.GivenName,'“或”@GivenFirstName“)例如

另外,请尝试阅读INFLEXIONAL参数here

答案 1 :(得分:0)

感谢大家的帮助。我最初使用这个,所以当é等重音字符输入到搜索中时,它们仍会返回没有重音的结果,反之亦然。

我最终只使用了条带重音函数,如下所示:

(((dbo.fn_StripAccents(B.GivenName)=dbo.fn_StripAccents(@GivenFirstName))  
or ((@GivenFirstName = '""') 
or (@GivenFirstName is null)) 
or (dbo.fn_StripAccents(B.GivenName) like +'%'+ dbo.fn_StripAccents(@GivenFirstName)) 
or (dbo.fn_StripAccents(B.GivenName) like  dbo.fn_StripAccents(@GivenFirstName) + '%' )     
or (dbo.fn_StripAccents(B.GivenName) like + '%'+ dbo.fn_StripAccents(@GivenFirstName) + '%' ))

答案 2 :(得分:0)

试试这个:

...
WHERE B.GivenName COLLATE LATIN1_GENERAL_CI_AI LIKE 
   '%' + ISNULL(@GivenFirstName, '') COLLATE LATIN1_GENERAL_CI_AI + '%'

将排序规则更改为不区分大小写,不区分重音将进行比较而不使用双方的重音。如果变量为空,IsNull会将变量变为空字符串,如果它是空字符串,则搜索字符串将为'%%',这基本上意味着'从任何事物开始并以任何结束',因此也将返回真。