0

私は暗示的なタグ付けシステムを構築しています(怪しげに聞こえます)。文字列をデータベースに渡し、一致した場合はそのタグを送り返します。タグの重複をやめたいので、タグが1つWEBなら1回だけ返してほしい。したがって、タグとして WEB があり、WEEKLY を追加した場合、「WE」と入力しても、2 回目の候補として WEB が表示されません。

しかし、機能していないようです。現在のタグを送信し、NOT IN() を使用して重複を削除します。以下は 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

get が渡されるのは次のとおりです。

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

このクエリに対する応答は、vTagName = Web です。明らかに、これは正しい結果ではありません。vTagName LIKE "We" NOT IN "Web, etc..."..

前もって感謝します!

4

2 に答える 2

3

IN ステートメントはそのようには機能しません。

あなたがしなければならないことは

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

その場合、それを1つの変数に入れることは機能しません。

于 2009-10-21T08:40:55.280 に答える
2

文字列を分割するか、SQL ステートメント全体を動的 SQL に変換する必要があります。

編集:

他の例に従って変数を分割するか、動的 SQL を実行します。

これはベスト プラクティスではありませんが、単にアイデアを提供するためのものです。

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
于 2009-10-21T08:37:38.703 に答える