【问题标题】:Struggling with CONTAINS (SQL Server 2008)与 CONTAINS 斗争 (SQL Server 2008)
【发布时间】:2014-10-09 07:39:54
【问题描述】:

我正在尝试使用另一个表 (DNI_Names) 中的列的详细信息来搜索一个表 (Asset_Database_Current) 中的列。我编写了一个循环来遍历每个 DNI_Name,然后使用 SELECT CONTAINS 语句(希望)将 DNI_Name 与 Asset_Database_Current 中的相关列进行比较。

我已经建立了一个全文目录,并且已经为 Asset_Database_Current 表建立了索引以供搜索。

这是我的代码:

DECLARE
   @Asset varchar(8)
 , @software_Name VARCHAR(64)
 , @dniSW VARCHAR(64)
 , @DNI VARCHAR(64)

CREATE TABLE #temp_naughtyChildren (naughtyAsset CHAR(8), naughtySW VARCHAR(64))
-- ^ where the Naughty People eventually get put

DECLARE #dni_cur CURSOR FOR
SELECT DNI_Names.DNI_Name
FROM DNI_Names
OPEN #dni_cur
FETCH NEXT FROM #dni_cur 
INTO @DNI

WHILE @@FETCH_STATUS = 0 
BEGIN -- we go through DNI_Names, selecting each instance of DNI_Name one at a time...

    INSERT INTO #temp_naughtyChildren (naughtyAsset, naughtySW)
    SELECT Asset_Number, Software_Name
    FROM Asset_Database_Current
    WHERE CONTAINS (Asset_Database_Current.Software_Name, @DNI)

    FETCH NEXT FROM #dni_cur 
    INTO @DNI

END 

DEALLOCATE #dni_cur

-- #temp_NaughtyChildren is now full of all the Asset Numbers and swName's of people who 
--  have been very, very naughty. The table can now be used as required (emailed, sent to 
--  another d/b, etc.).
 SELECT * from #temp_NaughtyChildren ORDER BY naughtyAsset

DROP TABLE #temp_naughtyChildren

END
GO 

上面的代码成功完成,但是当我尝试执行查询时,我得到了两次以下错误:

消息 7630,级别 15,状态 3,过程 DNIChecker,第 44 行 全文搜索条件“App Manager”中“Manager”附近的语法错误。

我的老板也执行了查询(他对数据库拥有完全权限)并且得到了完全相同的错误。

您能给我的任何建议都会非常感激(我从 1998 年开始就没有学过 SQL,我意识到当他们在 Uni 教你 SQL 时,他们实际上并没有教你太多 SQL,我已经花了在过去的 2 1/2 周里,我在各种网站上搜索。直到昨天,我终于偶然发现了一篇文章,提到有一个设置全文搜索的向导!!)。

谢谢,M

【问题讨论】:

  • 我认为您的循环是多余的,因为您一次搜索一个关键字(似乎是这样,对吗?)您可以通过 OR 将它们连接为 @ 来一次搜索多个关键字pln 在他的回答中也提到了(如果可以使用不同的搜索词找到相同的行,如果您想要重复的结果条目,您可能不想丢失循环)

标签: sql sql-server-2008 tsql


【解决方案1】:

CONTAINS 如果您使用完整的短语,则需要在搜索条件周围加上引号,否则您应该在单个词之间使用 NEAR、AND 或 OR。

SET @DNI = '"' + @DNI + '"';
INSERT INTO #temp_naughtyChildren (naughtyAsset, naughtySW)
SELECT Asset_Number, Software_Name
FROM Asset_Database_Current
WHERE CONTAINS (Asset_Database_Current.Software_Name, @DNI)

【讨论】:

  • 不幸的是,这给了我:“'+' 附近的语法不正确。”
  • 对不起,我修改了答案
  • 第一次没有用(出于某种原因,虽然我怀疑 SQL Server 2008 是由小情绪化的 Gremlins 操作的),但第二次它确实有效。非常感谢您的所有帮助 pln!!!
猜你喜欢
  • 1970-01-01
  • 2019-04-20
  • 2014-10-29
  • 1970-01-01
  • 2020-09-18
  • 2018-05-23
  • 2013-11-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多