在 SQL Server 2012 SP3 CU8 服务器实例上,我们将 PDF 文件插入到名为OBJECT_FILE
created 的表中,如下所示:
CREATE TABLE [dbo].[OBJECT_FILE](
[FILE_ID] [int] NOT NULL,
[FILE_FIN] [int] NOT NULL,
[OBJ_FILE_IDX_DOCTYPE] [varchar](3) NULL,
[FILE_TYPE] [smallint] NOT NULL,
[FILE_TXT] [varbinary](max) NULL,
[FILE_TXT_SIZE] [int] NULL DEFAULT ((0)),
CONSTRAINT [PK_DM_OBJECT_FILE] PRIMARY KEY CLUSTERED (
[FILE_ID] ASC
)
WITH (
PAD_INDEX = OFF,
STATISTICS_NORECOMPUTE = OFF,
IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON
) ON [INDEXFG]
) ON [INDEXFG] TEXTIMAGE_ON [BLOBFG]
我们还创建了一个基于FILE_TXT
列的全文索引,它是一个 VARBINARY(MAX),创建如下:
CREATE FULLTEXT INDEX
ON OBJECT_FILE (
FILE_TXT TYPE COLUMN OBJ_FILE_IDX_DOCTYPE
)
KEY INDEX PK_DM_OBJECT_FILE
WITH STOPLIST=OFF;
在那个表中,我们愿意插入旧文档的内容。在这些内容中,我们将找到一个插入过去的唯一标识符,该标识符遵循命名约定:
CORP-MMM-<three_digits_0_to_9>.<three_digits_0_to_9>
当我尝试使用 CONTAINS 内置函数对我知道它存在的特定标识符进行查找时,它不会给我任何结果。我使用以下 WHERE 子句:
WHERE CONTAINS(FILE_TXT,'CORP-MMM-456.245')
尽管使用以下 WHERE 子句的查找为我提供了多个结果:
WHERE CONTAINS(FILE_TXT,'CORP-MMM-456.*')
并且可以通过以下方式找到相关记录LIKE
:
WHERE FILE_TXT LIKE '%CORP-MMM-456.245%'
我的问题是:
为什么我不能获得关于我的 WHERE 子句的特定记录,我怎样才能让它发挥作用?
抱歉,这可能不是答案,但我不能对此发表评论。根据 OP @Jefferson 的评论(作为对我评论的回答),我无法重现该行为。我可以使用与该值完全匹配的 where 子句获取记录。
我用下面的代码测试了这个(从这里复制和修改)
这就是我得到的结果集。
清理代码。
解决方案包括将全文索引从英语更改为中性语言。
这可以使用
sys.dm_fts_parser
SQL Server 的以下内置函数来解释。select * from sys.dm_fts_parser( '" dsolkjfdskljfsd dfsd-MMM-236.127 dojfdslfkjds"', 1033, -- English NULL, 0 ) ;
导致删除“。” 关键字中的字符:
而以下代码使此字符可用于查找:
select * from sys.dm_fts_parser( '" dsolkjfdskljfsd dfsd-MMM-236.127 dojfdslfkjds"', 0, -- Neutral NULL, 0 ) ;
结果:我们删除了现有索引并使用
LANGUAGE 0
选项创建它,这解决了我们的问题。