我有一个有'品牌'下拉菜单和'模型'下拉菜单的表单。我在这里搜索有一些品牌和/或型号的汽车。 现在,如果我选择“品牌”下拉列表中的“全部”以及“全部”之外的某些“模型”值,我会使用
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''))'
答案 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注入漏洞的影响,如果您手动转义引号则会受到这种情况的影响。