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!

Foi útil?

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top