COALESCE和FTS一起

时间:2011-04-09 12:44:31

标签: sql-server-2005 tsql stored-procedures full-text-search

我有一个有'品牌'下拉菜单和'模型'下拉菜单的表单。我在这里搜索有一些品牌和/或型号的汽车。 现在,如果我选择“品牌”下拉列表中的“全部”以及“全部”之外的某些“模型”值,我会使用

  

COALESCE(@品牌,cars.brand)

  

COALESCE(@模型,cars.model)

,如果我为下拉菜单和特定结果选择“全部”,如果我选择一些值,它可以正常返回所有车辆。 现在我想将FTS与CONTAINS关键字一起使用并使用类似

的查询
CONTAINS(cars.model , 'COALESCE(@model,cars.model)')

返回错误

  

'('在全文搜索条件'COALESCE(@ model,cars.model)'附近的语法错误。

如果有人可以将我与COALESCE一起推荐给FTS的查询/ sproc,我真的很感激。请帮忙。 P.S

SET @SQL = '
SET @query_result = ( 
    SELECT items.id AS "ID"
            ,items.title AS "Title"
            ,cars.brand AS "Brand"
            ,cars.model AS "Model"
            ,cars.type AS "Type"
            ,items.city AS "City"
            ,items.name AS "Name"
            ,items.date_added AS "Date"
            ,items.small_1 AS "Image"
      FROM [cars]
      JOIN [items] 
        ON items.id=cars.item_id
     WHERE cars.item_id = COALESCE(@item_id,cars.item_id)
            AND CONTAINS(cars.brand ,''COALESCE('+@brand+',cars.brand)'')
            AND cars.model = COALESCE(@model,cars.model)
            AND cars.type = COALESCE(@type,cars.type)
            AND items.city = COALESCE(@city,items.city)
            AND DATEDIFF(DAY,items.date_added,GETDATE())<=COALESCE(@period,items.date_added)
            AND items.new = COALESCE(@isnew,items.new)
       FOR XML
      PATH(''car''),ROOT(''items''))'

1 个答案:

答案 0 :(得分:0)

这是我以前从未见过的模式,如果我在理解,请原谅我。

我很确定这一行是问题所在。

AND CONTAINS(cars.brand ,''COALESCE('+@brand+',cars.brand)'')

这个问题是它将生成子句:

AND CONTAINS(cars.brand, 'COALESCE(toyota,cars.brand)')

我认为这不是一个语法错误,但是合并表达式是该点的文字字符串,并且评估不会发生。如果brand为null,你也会遇到问题,因为你会在SQL代码的第一部分和最后一部分附加NULL。

您可以尝试简单地说:

AND CONTAINS(cars.brand, coalesce(@brand, cars.brand))

没有全部逃脱。如果由于某些原因无效,请尝试:

' + CASE WHEN @brand is null then '' else 'AND CONTAINS(cars.brand, @brand)' end + '

这只会在@brand首先不为null时插入子句,并且不受sql注入漏洞的影响,如果您手动转义引号则会受到这种情况的影响。