- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个非常特殊的案例。我的 ASP.NET 页面调用我们的存储过程,该过程对我们的数据库执行全文搜索查询。一些经常搜索的字符串包含一个符号,因为我们产品的一些品牌(也包括知名品牌)的名称中有一个 &
。
事实证明,在某些情况下我得不到任何结果除非我转义符号(\&
),而在另一种情况下我得不到任何结果< em>仅当我转义 & 符号时。
我不知道这是否相关,但是(没有给出品牌名称)一个以 &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
搜索其中包含 & 符号的字符串?最好不必将 & 符号转换为另一个安全字符?
最佳答案
您看到的奇怪行为很可能是由于 CONTAINS和 CONTAINSTABLE使用与号 ( &
) 字符等同于 AND
运算符的函数(均与 SQL Server 的全文搜索功能一起使用)。以下语句摘自 CONTAINS
的文档:
The ampersand symbol (&) may be used instead of the AND keyword to represent the AND operator.
没有提到它有任何转义字符(反斜杠通常不是 SQL 中的转义字符)。
更新
根据问题“编辑 2”中现在提供的信息以及其他研究,我会说您不需要逃避任何事情。似乎将搜索短语放在双引号中(作为使用 FORMSOF
的结果)将 &
视为文字或分词符,具体取决于值在 &
的两边。请尝试以下示例:
DECLARE @Term NVARCHAR(100);
SET @Term = N'bob&sally'; -- 48 rows
--SET @Term = N'bob\&sally'; -- 48 rows
--SET @Term = N'r&f'; -- 4 rows
--SET @Term = N'r\&f'; -- 24 rows
SET @Term = N'FORMSOF(INFLECTIONAL,"' + @Term + '")';
SELECT * FROM sys.dm_fts_parser(@Term, 1033, 0, 0);
SELECT * FROM sys.dm_fts_parser(@Term, 1033, 0, 1);
SELECT * FROM sys.dm_fts_parser(@Term, 1033, NULL, 0);
SELECT * FROM sys.dm_fts_parser(@Term, 1033, NULL, 1);
bob&sally
和 bob\&sally
的结果是一样的,在这两种情况下 bob
和 sally
是分开的,永远不会组合成一个完全匹配的字符串。
但是,r&f
和 r\&f
之间的结果并不相同。 r&f
仅被视为单个完全匹配的字符串,因为单独的 r
和 f
不是已知词。另一方面,添加反斜杠将两个字母分开,因为 \
是一个分词器,在这种情况下,您会得到 r
和 f
.
鉴于您在更新中声明您有“数据不一致,其中一个名称中带有“&”的品牌被修改为没有“&”,而另一个则没有”,我怀疑当您不添加 \
字符时,您会得到未修改的品牌(因为它是完整术语的精确匹配)。但是,当您确实添加\
字符时,您会得到被修改为具有&
的品牌已删除,因为您现在正在搜索两件作品,每件都与该品牌名称的一部分相匹配。
我会修复数据以使其保持一致:更新删除了 &
的品牌名称以将&符号放回原处。然后当人们使用 &
进行搜索时 如果不 添加额外的 \
,它将是完全匹配。这种行为将包含在数据中,并且不需要您添加代码来规避 FTS 的自然操作,这似乎是一种容易出错的方法。
关于sql-server - 使用 CONTAINSTABLE 转义 SQL Server 全文搜索查询中的符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39643231/
我在表格上使用 containstable() 进行搜索,但如果我在搜索字符串中只输入单个字符,它就不起作用。以下是我正在使用的查询。 DECLARE @FreeTextSearch VARCHAR(
我有一个包含很多字段的表。为了搜索此表中的信息,我使用全文搜索。当我尝试查找电话号码或 Skype 名称字段中存在三个零的行时,我也使用正确的记录获取包含一些带点和数字的字符串的记录(例如 strin
我有一个搜索查询,它采用用户输入的短语并应返回结果,这是一个示例: SELECT rank,[KEY] FROM CONTAINSTABLE(tblproduct, (title,subtitle,p
我正在使用CONTAINSTABLE搜索两个表列。一旦搜索包含“the”、“for”、“a”等小词,即使它们实际出现在列中,搜索也不会返回任何结果。 简单的例子。正在搜索的列包含文本。 “系统需要升级
这个问题是关于 SQL Server's FTS ContainsTable . 为了重现这个问题,我们可以使用下面的脚本来创建一个表并用地址填充它。 CREATE TABLE Address (Fu
我们有一个有趣的问题,我希望有人能帮助解释一下。在高层次上,问题如下: 以下查询快速执行(1 秒): SELECT SA.* FROM cg.SEARCHSERVER_ACTYS AS SA JOIN
这是我的 Previous Query 的延续 动态链接库 CREATE TABLE [dbo].[t]( [words] [varchar](1000) NULL, [id] [in
例如,我有一个表Companies。其中有一个字段FullName,我在该字段上获得了全文索引。然后我用 CONTAINSTABLE 和 @search_word 加入该表,例如 "company*"
我正在使用全文搜索在 AdventureWorks 数据库中游玩。在 production.ProductDescription 中,我试图搜索“mountain”和“replacements”。 我
我有一个表格,其中包含可以在 sql-server-2008 中搜索的广告。请参阅以下代码段。 ad_search 表中的 is_searchable 基本上是该广告是否应包含在搜索中的标志。 下面的
我正在使用 SQL Server 2008 动态链接库 CREATE TABLE [dbo].[t]( [words] [varchar](1000) NULL, [id] [int]
我们有一个返回此内容的过程: SELECT TOP 15 SearchName, AlternateName, CountryName, StateProvince, Latitude, Longit
我惊讶地发现 CONTAINS 或 CONTAINSTABLE 似乎都不支持如下所示的语法,您在其中为最后一个搜索条件参数传递列名称。 SELECT * FROM dbo.Articles AS a
我正在运行一个 TSQL 查询,该查询使用像这样的 CONTAINSTABLE 语句 CONTAINSTABLE(, , '01100011') 这给了我正确的结果。但是,如果我使用 CONTAINS
我在启用了文件流的 varchar(max) 类型列上创建了全文索引。文件流包含 JPG、TIF、PDF 和 XML 等数据(尽管我认为这与问题大多无关)。 我创建了两个查询,允许我在索引上进行搜索。
我有一个非常基本的场景,但我所读到的内容听起来使用 SQL Server 全文目录和索引并不容易。 我有 2 列,名字和姓氏。我想支持对它们的全文搜索,这样如果有人输入“John Smith”,则第一
我正在努力寻找解决方案以改进字符串搜索过程,我选择了FULL-TEXT INDEX 策略。 但是,在实现它之后,我仍然可以看到在使用多个带有 OR 子句的全文索引表使用多个字符串进行搜索时,性能会受到
我在自动完成下拉列表上使用存储过程来检索客户列表。一些客户的名字中有一个“&”(符号)符号,例如“H&M”、“Marks & Spencers”和用户希望在“&”符号上进行搜索。 当我直接使用 & 符
我有一个非常特殊的案例。我的 ASP.NET 页面调用我们的存储过程,该过程对我们的数据库执行全文搜索查询。一些经常搜索的字符串包含一个符号,因为我们产品的一些品牌(也包括知名品牌)的名称中有一个 &
我想进行查询以检索具有 NEAR 语法的人。当我搜索第二个单词中包含字母 N 的任何文本时,结果始终为空。 我有两个人 Ricardo 在 table 上登记,“Ricardo Mova”和“Rica
我是一名优秀的程序员,十分优秀!