SQL Server 2008 NOT IN () sembra venire a mancare
-
22-09-2019 - |
Domanda
Sto costruendo un sistema di etichettatura suggestiva (suona squallido), passo in una stringa al db e se c'è una corrispondenza rimanda quel tag. Voglio smettere di tag duplicati, quindi se un tag è WEB, io lo voglio solo da restituire una volta. Quindi, se ho avuto WEB come tag e poi aggiungo SETTIMANALE, digitando "NOI" non far apparire WEB per la seconda volta come un suggerimento.
Ma, sembrano essere non funzionante. Mando i tag correnti e non uso IN () per rimuovere eventuali duplicati. Di seguito è riportato il codice 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 questo è quello che ottiene è passato in:
EXEC GetTagSuggest 'We','Web,Print,Design,Advertising,Revenue'
La risposta a questa domanda è vTagName = Web. Ovviamente, questo non è un risultato corretto come dovrebbe essere vTagName LIKE "Noi" NOT IN "Web, ecc ..." ..
Grazie in anticipo!
Soluzione
La dichiarazione IN non funziona così.
Quello che dovrete fare è
t.vTagName not in ('Web','Print','Design','Advertising','Revenue')
Avere in una variabile non funziona in questo caso.
Altri suggerimenti
È necessario dividere le corde, o convertire l'intera istruzione SQL per SQL dinamico.
EDIT:
suddividere le variabili per l'altro esempio, o fare SQL dinamico.
Questo non è delle migliori pratiche , ma è semplicemente per dare un'idea:
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