SQL Server 2008 NOT IN () semble échouer
-
22-09-2019 - |
Question
Je suis la construction d'un système de marquage suggestif (sons miteux), je passe dans une chaîne à la db et s'il y a un match, il renvoie cette balise. Je veux arrêter des balises en double, donc si une balise est WEB, je veux seulement qu'elle soit retournée une fois. Donc, si j'avais WEB comme une étiquette, puis ajouter HEBDOMADAIRE, en tapant « NOUS » ne met pas sur le Web pour une seconde fois comme une suggestion.
Mais, semblent ne fonctionne pas. J'envoie les balises actuelles et utiliser NOT IN () pour supprimer les doublons. Voici le code 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
Et voici ce get passé dans:
EXEC GetTagSuggest 'We','Web,Print,Design,Advertising,Revenue'
La réponse à cette requête est vTagName = Web. De toute évidence, ce n'est pas un résultat correct car il devrait être vTagName LIKE "Nous" NOT IN "Web, etc ..." ..
Merci d'avance!
La solution
L'instruction IN ne fonctionne pas comme ça.
Qu'est-ce que vous avez à faire est
t.vTagName not in ('Web','Print','Design','Advertising','Revenue')
Avoir dans une variable ne fonctionnera pas dans ce cas.
Autres conseils
Vous devez diviser les chaînes, ou convertir l'intégralité de l'instruction SQL à SQL dynamique.
EDIT:
Diviser des variables par exemple l'autre, ou faire SQL dynamique.
Ce n'est pas la meilleure pratique , mais il est tout simplement pour vous donner une idée:
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