我有一个非常特殊的情况。我的ASP.NET页面调用我们的存储过程,对我们的数据库执行全文搜索查询。一些常见的搜索字符串包括一个&符号,因为我们的几个品牌的产品(知名品牌)也有一个&
的名字。使用CONTAINSTABLE转义SQL Server全文搜索查询中的&符号
事实证明,在一定的情况下,我没有得到任何结果除非我逃脱符号(\&
),并在其他一些情况下,我没有得到任何结果只有当我逃离符号。
我不知道这是否相关,但是(没有给出品牌名称)一端以&b
结尾,另一端以&c
结尾。
这些字符串(&b
或&c
)有可能具有自己的特殊含义吗?而通过转义他们我实际上是传递一个特殊的字符串到T-SQL?
EDIT
附加信息:经过进一步的测试中,我证明了误差在存储过程本身。用&
或\&
调用它会得到不同的结果。
我会尝试发布存储过程的选定部分。我不会发表全部内容,因为大部分内容并不真正相关。
vParamBuca
参数是导致故障的参数。值可以是'word&letter'
或word\&letter
。
SET @ricercaA = '''FORMSOF(INFLECTIONAL,"' +
REPLACE(LTRIM(RTRIM(@vParamBuca)),' ', '") AND FORMSOF(INFLECTIONAL,"') + '")'''
变量@ricercaA
然后用于创建查询字符串:
[...]
FROM Products AS FT_TBL
LEFT OUTER JOIN CONTAINSTABLE (Products, Sign1, '+ @ricercaA + ') AS ColSign1_0 ON FT_TBL.ID = ColSign1_0.[KEY]
LEFT OUTER JOIN CONTAINSTABLE (Products, ManufacturerAdditionalText, '+ @ricercaA + ') AS ColManufacturerAdditionalText_0 ON FT_TBL.ID = ColManufacturerAdditionalText_0.[KEY]
LEFT OUTER JOIN CONTAINSTABLE (Products, ManufacturerForSearch, '+ @ricercaA + ') AS ColManufacturer_0 ON FT_TBL.ID = ColManufacturer_0.[KEY]
LEFT OUTER JOIN CONTAINSTABLE (Products, TuttaLaRiga, '+ @ricercaA + ') AS ColTuttaLaRiga_0 ON FT_TBL.ID = ColTuttaLaRiga_0.[KEY]
[...]
EDIT 2
非常感谢@srutzky指着我在正确的方向!与此同时,我还发现数据不一致,其中名称中的&
其中一个品牌被修改为不具有&
,而另一个品牌未被修改(底线,我目前的问题是由于:a部分修复是由某人在过去做出的)。
无论如何,回到正轨。现在我明白CONTAINSTABLE
函数中的&
字符被视为逻辑AND(非按位)。
我仍然需要一个解决方案。 This answer给出了一个不适合我的解决方案(条件与我的不一样)。我怎样才能执行一个CONTAINSTABLE
搜索字符串与&符号?最好不必将&符号转换为另一个安全字符?
不确定它是否与您的问题有关,而且是T-SQL中的按位和运算符。 – Kevin
您能向我们展示您正在执行的查询的示例以及表中列的类型吗? – Dalorzo
请向我们展示您的存储过程 – EricZ