SQL Server Freetext Varbinary ничего не возвращает и преобразование VARBINARY -> VARCHAR не работает - PullRequest
1 голос
/ 09 марта 2020

Эй, у меня есть несколько проблем с моим решением, и я не могу понять его

Ниже приведена таблица создания

    CREATE TABLE FreeTextSearch
(
    [ID] BIGINT NOT NULL IDENTITY(1,1),
    [Content] VARBINARY(MAX) NOT NULL,
    [SubjectClass] VARCHAR(30) NOT NULL,
    [SubjectID] VARCHAR(30) NOT NULL,
    [ColumnName] VARCHAR(128) NOT NULL,
    CONSTRAINT PK_FreeTextSearch PRIMARY KEY (ID)
);


ALTER TABLE FreeTextSearch
Add FileExtension As '.html';

CREATE INDEX FreeTextSearch_SubjectClass
ON FreeTextSearch ([SubjectClass]); 


CREATE FULLTEXT CATALOG [freetext_catalog]


CREATE FULLTEXT INDEX ON FreeTextSearch
(
    [Content] TYPE COLUMN FileExtension
)
    KEY INDEX PK_FreeTextSearch ON freetext_catalog;

Это создаст таблицу FreeTextSearch с FileExtension из HTML et c.

Данные, преобразованные в VARBINARY, автоматически вставляются в таблицу на основе триггера, но сейчас есть две проблемы

Содержимое, например:

<p>Test note for free text bla!</p>

Не будет обнаружен запросом типа

    SELECT
    Id,
    CONVERT(VARCHAR(MAX), [Content]) AS [Content]
FROM dbo.FreeTextSearch
WHERE FREETEXT ([Content], 'Test')

Дополнительно

    SELECT
    Id,
    CONVERT(VARCHAR(MAX), [Content]) AS [Content]
FROM dbo.FreeTextSearch

Вернет

ID: 1 Content <
ID: 2 Content <

Пока

    SELECT
    Id,
    CONVERT(XML, [Content]) AS [Content]
FROM dbo.FreeTextSearch

вернется

ID: 1 Content: <p>Test note for free text bla!</p>
ID: 2 Content: <p>Something is very wrong with this one i think</p><p>Not really sure what.</p>

Это правильные данные, но неясно, почему

  1. FREETEXT ничего не находит
  2. Почему VARCHAR (MAX ) возвращает только <</li>

1 Ответ

1 голос
/ 09 марта 2020
select test, cast(test as varchar(max)), cast(test as nvarchar(max))
from
(
select cast('a' as varbinary(max)) + 0x0 /* nul in ascii, anything after that not printed*/ + cast('123' as varbinary(max)) as test
) as src;


select test, cast(test as varchar(max)), cast(test as nvarchar(max))
from
(
select cast(N'<p>Test note for free text bla!</p>' as varbinary(max)) as test
) as src;
...