【发布时间】:2018-08-16 16:30:38
【问题描述】:
我有一个非常特殊的案例。我的 ASP.NET 页面调用我们的一个存储过程,它在我们的数据库上执行全文搜索查询。一些经常搜索的字符串包含一个 & 符号,因为我们的一些产品品牌(也包括知名品牌)的名称中有 &。
事实证明,在某种情况下,我没有得到任何结果除非我逃脱了与号(\&),而在另一种情况下,我没有得到任何结果只有我逃脱了和号。
我不知道这是否相关,但是(没有给出品牌名称)一个以&b 结尾,另一个以&c 结尾。
这些字符串(&b 或&c)有没有可能有它们自己的特殊含义?通过转义它们,我实际上是在将一个特殊的字符串传递给 T-SQL?
编辑
附加信息:经过进一步测试,我证明错误出在存储过程本身。用& 或\& 调用它会产生不同的结果。
我将尝试发布存储过程的选定部分。我不会全部发布,因为大部分内容并不相关。
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]
[...]
编辑 2
非常感谢@srutzky 为我指明了正确的方向!同时,我还发现了一个数据不一致的地方,其中一个名称带有&的品牌被修改为没有&,而另一个没有被修改(归根结底,我现在的问题是由通过那个:过去某人所做的部分修复)。
无论如何,回到正轨。现在我明白CONTAINSTABLE 函数中的& 字符被视为逻辑与(非按位)。
我仍然需要一个解决方案。 This answer 给出了一个对我不起作用的解决方案(条件和我的不一样)。我如何执行CONTAINSTABLE 搜索带有与号的字符串?最好不必将 & 符号转换为另一个安全字符?
【问题讨论】:
-
不确定它是否与您的问题有关,但是 & 是 T-SQL 中的按位和运算符。
-
...和您的 .NET 代码。如果您将字符串作为强类型参数传递,则&符号不会在任何地方造成任何问题。
-
转义与否,
&曾经是一个特殊字符,您看到的变化可能与它被“转义”无关,而是与 SQL 之后看到/搜索的其他内容有关服务器接受&的含义。谷歌一下。 -
当您说“对我们的数据库执行全文搜索”时,您的意思是您使用的是实际的全文搜索功能,还是
LIKE '%' + @variable + '%'运算符?` isn't a T-SQL escape, so if you aren't using Full Text Search (where&` 也应该在使用CONTAINS函数时作为逻辑AND工作),那么您的应用程序代码可能正在转换&,而不是使用 ``. -
谢谢大家,我已经发布了T-SQL过程的相关部分。恐怕它与按位有关,虽然:(
标签: sql-server tsql escaping full-text-search