Я использую SQL Сервер 2019 (RTM-GDR) (KB4517790) - 15.0.2070.41 (X64).
Я запрашиваю данные через SSMS 15.0.18330.0.
I иметь таблицу, содержащую 10 094 641 строку, которая определяется следующим образом:
- создать таблицу
CREATE TABLE dbo.TableName (
RowID bigint NOT NULL identity (1,1)
, RowSyntax varchar(max)
, hasLanguageReference int DEFAULT 0
, CONSTRAINT PK_TableName_RowID PRIMARY KEY CLUSTERED (RowID)
)
--create fulltext catalog and index
IF NOT EXISTS (
SELECT 1
FROM sys.fulltext_catalogs
WHERE [name] = 'TableName_ftc'
)
CREATE FULLTEXT CATALOG TableName_ftc AS DEFAULT;
CREATE FULLTEXT INDEX ON dbo.TableName (RowSyntax Language 1033) KEY INDEX PK_MyTable_RowID
--insert test row
INSERT INTO dbo.TableName (RowSyntax)
VALUES ('in v3 it would be set to 128000 (bits/second)')
--look for a string in the RowSyntax
SELECT RowID, RowSyntax
from dbo.TableName
WHERE CONTAINS(RowSyntax, 'Set-')
результат запроса
| RowId | RowSyntax
| 1 | in v3 it would be set to 128000 (bits/second)
Эта тестовая строка, однако, НЕ содержит строку поиска 'Set -' (с да sh).
Почему CONTAINS () возвращает ложное срабатывание? Это раздевает определенных персонажей? CONTAINS () не может обрабатывать пробелы и некоторые специальные символы, такие как знак #, но не выдает ошибку для символов поиска, таких как тире или точки; он просто полностью их игнорирует?
В гораздо меньшей таблице LIKE '%Set-%'
будет работать, но не в таблице с большими столбцами varchar (), с 10M строками и ростом.
Мой самый большой LEN(RowSyntax)
значение составляет 13 757 798. Разделение больших строк на несколько столбцов не вариант.
Q1: CONTAINS () работает как задумано? Сценарий, приведенный выше, является особенностью? : -)
Q2: Какие есть другие альтернативы для поиска строк больших символов в SQL Server? Желательно что-то, что может обрабатывать оба пробела и любой специальный символ, который кто-то бросает в него.
Не могли бы вы посоветовать? Спасибо.