2009-10-21 107 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有不同的方法来执行这些类型的搜索