Вопрос

Я создаю систему наводящих на размышления тегов (звучит захудало), я передаю строку в базу данных, и если есть совпадение, она отправляет обратно этот тег.Я хочу остановить дублирование тегов, поэтому, если один тег является 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top