0

我正在构建一个暗示性标记系统(听起来很破旧),我将一个字符串传递给数据库,如果有匹配项,它会发回该标记。我想停止重复标签,所以如果一个标签是WEB,我只希望它返回一次。因此,如果我将 WEB 作为标签,然后添加 WEEKLY,则键入“WE”不会作为建议再次显示 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')

在这种情况下,将它放在一个变量中是行不通的。

于 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 回答