2009-10-21 131 views
0

我正在構建一個暗示性的標記系統(聽起來很劃痕),我將一個字符串傳遞給數據庫,如果有匹配,它會發回該標記。我想停止重複的標籤,所以如果一個標籤是WEB,我只希望它被返回一次。因此,如果我將WEB作爲標籤,然後添加WEEKLY,則鍵入「WE」不會再提示WEB作爲建議。SQL Server 2008 NOT IN()似乎失敗

但是,似乎沒有工作。我發送當前標籤並使用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 

而這正是獲得通過真實:

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

這個查詢的響應是vTagName =網頁。顯然,這不是一個正確的結果,因爲它應該是vTagName LIKE「我們」不在「網絡等...」。

在此先感謝!

回答

3

中語句不喜歡的工作。

你將要做的就是

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

有它的一個變量不會在這種情況下工作。

+0

這就是我在回答「分割字符串」時所說的。 – 2009-10-21 08:46:28

+0

要將當前標記作爲拆分字符串傳遞給我(在傳統asp中):EXEC GetTagSuggest'Web','''Web'','Create'''。當選中時,返回:'Web','創建'。但是當像這樣傳入時:t.vTagName NOT IN(@vCurrentTags),它仍然不起作用。在SQL中如何分割字符串? – jamesmhaley 2009-10-21 09:11:55

+0

@randolph:據​​我所知,但我需要更多的信息,一行:) – jamesmhaley 2009-10-21 09:13:33

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 
+0

你能否進一步解釋了良好的article? – jamesmhaley 2009-10-21 08:40:07

1

厄蘭Sommarskog有不同的方法來執行這些類型的搜索