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!

È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top