Em uma instância do servidor SQL Server 2012 SP3 CU8, temos arquivos PDF que foram inseridos em uma tabela chamada OBJECT_FILE
criada da seguinte forma:
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]
Também criamos um Índice FullText que é construído na FILE_TXT
coluna, que é um VARBINARY(MAX), criado da seguinte forma:
CREATE FULLTEXT INDEX
ON OBJECT_FILE (
FILE_TXT TYPE COLUMN OBJ_FILE_IDX_DOCTYPE
)
KEY INDEX PK_DM_OBJECT_FILE
WITH STOPLIST=OFF;
Nessa tabela, estamos dispostos a inserir o conteúdo de documentos antigos. Nestes conteúdos, encontraremos um identificador único inserido no passado que segue uma convenção de nomenclatura:
CORP-MMM-<three_digits_0_to_9>.<three_digits_0_to_9>
Quando tento fazer uma pesquisa usando a função interna CONTAINS em um identificador específico que sei que existe, ele não me retorna nenhum resultado. Eu uso a seguinte cláusula WHERE:
WHERE CONTAINS(FILE_TXT,'CORP-MMM-456.245')
embora uma pesquisa com a seguinte cláusula WHERE me forneça vários resultados:
WHERE CONTAINS(FILE_TXT,'CORP-MMM-456.*')
e o registro em questão pode ser encontrado com LIKE
:
WHERE FILE_TXT LIKE '%CORP-MMM-456.245%'
Minha pergunta é:
Por que não consigo obter um registro específico sobre minha cláusula WHERE e como posso fazê-la funcionar?
Desculpe, isso pode não ser uma resposta, mas não posso colocar isso no comentário. Com base no comentário do OP @Jefferson (como resposta ao meu comentário), não consegui reproduzir o comportamento. Eu posso obter um registro de volta com a cláusula where que corresponde exatamente ao valor.
Eu testei isso com o seguinte código (copiado e modificado daqui )
Isso é o que recebo como meu conjunto de resultados.
Código de limpeza.
A solução consistiu na mudança do Índice de Texto Completo de inglês para idioma neutro.
Isso pode ser explicado usando a seguinte
sys.dm_fts_parser
função interna do SQL Server.select * from sys.dm_fts_parser( '" dsolkjfdskljfsd dfsd-MMM-236.127 dojfdslfkjds"', 1033, -- English NULL, 0 ) ;
leva à exclusão do "." caractere em palavras-chave:
ao seguir o código, mantenha esse caractere disponível para pesquisas:
select * from sys.dm_fts_parser( '" dsolkjfdskljfsd dfsd-MMM-236.127 dojfdslfkjds"', 0, -- Neutral NULL, 0 ) ;
Resultados:Nós descartamos o índice existente e o criamos usando a
LANGUAGE 0
opção e isso resolveu nosso problema.