【问题标题】:SQL Server 2008 NOT IN() seems to failSQL Server 2008 NOT IN() 似乎失败了
【发布时间】:2009-10-21 08:35:35
【问题描述】:

我正在构建一个提示性标记系统(听起来很糟糕),我将一个字符串传递给数据库,如果有匹配项,它会发回该标记。我想停止重复标签,所以如果一个标签是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

这就是传入的内容:

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

对此查询的响应是 vTagName = Web。显然,这不是一个正确的结果,因为它应该是 vTagName LIKE "We" NOT IN "Web, etc..."..

提前致谢!

【问题讨论】:

  • Erland Sommarskog 在执行这些类型的搜索的各种方式上都有很好的article

标签: sql-server-2008 stored-procedures in-function


【解决方案1】:

IN 语句不是这样工作的。

你需要做的是

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

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

【讨论】:

  • 这就是我在回复中所说的“拆分字符串”。
  • 要将当前标签作为拆分字符串传递,我发送以下内容(来自经典 asp):EXEC GetTagSuggest 'Web'、'''Web''、''Create'''。选择时,返回:'Web','Create'。但是当像这样传入时:t.vTagName NOT IN(@vCurrentTags),它仍然不起作用。如何在 SQL 中拆分字符串?
  • @randolph:我明白这一点,但我需要更多信息:)
  • 如果不能拆分字符串,不妨看看我描述的动态SQL方法。
【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-15
    • 2012-09-06
    • 2011-07-26
    • 2012-07-17
    • 1970-01-01
    • 1970-01-01
    • 2012-05-15
    • 1970-01-01
    相关资源
    最近更新 更多