Frage

Ich bin ein suggestiv Tagging-System baue (klingt zwielichtige), gehe ich in einem String an die DB und wenn es eine Übereinstimmung gibt es sendet den Tag. Ich mag doppelte Tags stoppen, so dass, wenn ein Tag WEB ist, ich will es nur einmal zurückgegeben werden. Also, wenn ich WEB als Tag habe und dann WOCHEN hinzufügen, die Eingabe von „WE“ nicht WEB zum zweiten Mal als Vorschlag bringen.

Aber, scheinen nicht zu funktionieren. Ich schicke die aktuellen Tags und NOT IN () Duplikate zu entfernen. Unten ist der SP-Code:

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

Und das ist das, was die bekommen übergeben:

EXEC GetTagSuggest 'We','Web,Print,Design,Advertising,Revenue'

Die Antwort auf diese Frage ist vTagName = Web. Offensichtlich ist dies kein richtiges Ergebnis, wie es sollte vTagName LIKE „Wir“ NICHT IN sein „Web, etc ...“ ..

Vielen Dank im Voraus!

War es hilfreich?

Lösung

Die Aussage IN funktioniert nicht so.

Was Sie tun müssen, ist

t.vTagName not in ('Web','Print','Design','Advertising','Revenue')

es in einer Variablen zu haben wird nicht funktioniert in diesem Fall.

Andere Tipps

Sie müssen die Saiten spalten, oder die gesamte SQL-Anweisung, um dynamische SQL zu konvertieren.

EDIT:

Split aus Variablen pro anderen Beispiel, oder tun dynamische SQL.

Dies ist nicht best practice , sondern einfach um Ihnen eine Idee zu geben:

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top