Базовое подтверждение концепции ... Фактического кода было бы меньше, но, поскольку я не знаю имен ваших таблиц / полей, это полный код, поэтому любой может проверить, работает ли он, настроить его и т. Д.
--Search Parameters
DECLARE @SearchString VARCHAR(MAX)
SET @SearchString='Oakland;City;Planning' --Using your example search
DECLARE @Delim CHAR(1)
SET @Delim=';' --Using your deliminator from the example
--I didn't know your table name, so I'm making it... along with a few extra rows...
DECLARE @Projects TABLE (ProjectID INT, ProjectName VARCHAR(200))
INSERT INTO @Projects (ProjectID, ProjectName) SELECT 1, 'Oakland City Planning'
INSERT INTO @Projects (ProjectID, ProjectName) SELECT 2, 'Oakland City Construction'
INSERT INTO @Projects (ProjectID, ProjectName) SELECT 3, 'Skunk Works'
INSERT INTO @Projects (ProjectID, ProjectName) SELECT 4, 'Oakland Town Hall'
INSERT INTO @Projects (ProjectID, ProjectName) SELECT 5, 'Oakland Mall'
INSERT INTO @Projects (ProjectID, ProjectName) SELECT 6, 'StackOverflow Answer Planning'
--*** MAIN PROGRAM CODE STARTS HERE ***
DECLARE @Keywords TABLE (Keyword VARCHAR(MAX))
DECLARE @index int
SET @index = -1
--Each keyword gets inserted into the table
--Single keywords are handled, but I did not add code to remove duplicates
--since that affects performance only, not the result.
WHILE (LEN(@SearchString) > 0)
BEGIN
SET @index = CHARINDEX(@Delim , @SearchString)
IF (@index = 0) AND (LEN(@SearchString) > 0)
BEGIN
INSERT INTO @Keywords VALUES (@SearchString)
BREAK
END
IF (@index > 1)
BEGIN
INSERT INTO @Keywords VALUES (LEFT(@SearchString, @index - 1))
SET @SearchString = RIGHT(@SearchString, (LEN(@SearchString) - @index))
END
ELSE
SET @SearchString = RIGHT(@SearchString, (LEN(@SearchString) - @index))
END
--This way, only a project with all of our keywords will be shown...
SELECT *
FROM @Projects
WHERE ProjectID NOT IN (SELECT ProjectID FROM @Projects Projects INNER JOIN @Keywords Keywords ON CHARINDEX(Keywords.Keyword,Projects.ProjectName)=0)
Я решил смешать несколько разных ответов в один: -P
Предполагается, что вы передадите список строк поиска с разделителями (переданный через @SearchString) как VARCHAR (MAX) , что - реально - вы не будете натолкнуться на ограничение для поиска по ключевым словам .
Каждое ключевое слово вычеркивается из списка и добавляется в таблицу ключевых слов. Возможно, вы захотите добавить код для удаления дублирующихся ключевых слов, но в моем примере это не повредит. Просто немного менее эффективно, так как в идеале нам нужно оценивать только один раз по ключевому слову.
Оттуда, любое ключевое слово, которое не является частью имени проекта, удаляет этот проект из списка ...
Таким образом, поиск "Окленд" дает 4 результата, а "Окленд; Город; Планирование" дает только 1 результат.
Вы также можете изменить разделитель, поэтому вместо точки с запятой он может использовать пробел. Или все, что плывет на твоей лодке ...
Кроме того, из-за объединений, а не из-за динамического SQL, он не подвергается риску SQL-инъекции, как вас беспокоило.