SQL Server 2008 NOT IN() parece falhar
-
22-09-2019 - |
Pergunta
Estou construindo um sistema de marcação sugestivo (parece decadente), passo uma string para o banco de dados e se houver uma correspondência ele envia de volta essa tag.Quero impedir tags duplicadas, portanto, se uma tag for WEB, quero que ela seja retornada apenas uma vez.Portanto, se eu tivesse WEB como tag e depois adicionasse WEEKLY, digitar "WE" não abriria WEB pela segunda vez como sugestão.
Mas parece que não está funcionando.Envio as tags atuais e uso NOT IN() para remover quaisquer duplicatas.Abaixo está o código 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
E é isso que é passado:
EXEC GetTagSuggest 'We','Web,Print,Design,Advertising,Revenue'
A resposta a esta consulta é vTagName = Web.Obviamente, este não é um resultado correto, pois deveria ser vTagName LIKE "We" NOT IN "Web, etc..."..
Desde já, obrigado!
Solução
O comunicado não funciona assim.
O que você terá que fazer é
t.vTagName not in ('Web','Print','Design','Advertising','Revenue')
Tê -lo em uma variável não funcionará nesse caso.
Outras dicas
Você precisa dividir as strings ou converter toda a instrução SQL em SQL dinâmico.
EDITAR:
Divida as variáveis de acordo com o outro exemplo ou faça SQL dinâmico.
Esta não é a melhor prática, mas é simplesmente para se ter uma ideia:
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