SQL Server 2008 NOT IN(), похоже, не работает
-
22-09-2019 - |
Вопрос
Я создаю систему наводящих на размышления тегов (звучит захудало), я передаю строку в базу данных, и если есть совпадение, она отправляет обратно этот тег.Я хочу остановить дублирование тегов, поэтому, если один тег является WEB, я хочу, чтобы он возвращался только один раз.Таким образом, если бы я указал WEB в качестве тега, а затем добавил ЕЖЕНЕДЕЛЬНО, ввод «МЫ» не приведет к появлению WEB во второй раз в качестве предложения.
Но, похоже, не работает.Я отправляю текущие теги и использую NOT IN() для удаления дубликатов.Ниже приведен код SP:
SELECT TOP 1 t.vTagName As vTagName
FROM Tags t
WHERE t.vTagName LIKE @vTagName+'%'
AND t.nTagPortalId = @nPortalId
AND t.vTagName NOT IN(@vCurrentTags)
ORDER BY vTagName ASC
И вот что передается:
EXEC GetTagSuggest 'We','Web,Print,Design,Advertising,Revenue'
Ответ на этот запрос: vTagName = Web.Очевидно, что это неправильный результат, поскольку оно должно быть vTagName КАК «Мы», НЕ В «Web и т. д.»..
Заранее спасибо!
Решение
Оператор IN так не работает.
Что вам придется сделать, это
t.vTagName not in ('Web','Print','Design','Advertising','Revenue')
В этом случае наличие его в одной переменной не будет работать.
Другие советы
Вам необходимо разделить строки или преобразовать весь оператор SQL в динамический SQL.
РЕДАКТИРОВАТЬ:
Разделите переменные согласно другому примеру или выполните динамический SQL.
Это не лучшая практика, а просто чтобы дать вам представление:
DECLARE @sql nvarchar(max) = 'SELECT TOP 1 t.vTagName As vTagName '
SELECT @sql = @sql + 'FROM Tags t '
SELECT @sql = @sql + 'WHERE t.vTagName LIKE ' + @vTagName + '% '
SELECT @sql = @sql + 'AND t.nTagPortalId = ' + @nPortalId + ' '
SELECT @sql = @sql + 'AND t.vTagName NOT IN(' + @vCurrentTags + ') '
SELECT @sql = @sql + 'ORDER BY vTagName ASC'
EXEC sp_executesql @sql, @vTagName, @nPortalId, @vCurrentTags