0

我有这个 sql 查询,我试图使用 CONTAINS 来搜索标题字段。

但我得到这个错误。

“不能在列 'Title' 上使用 CONTAINS 或 FREETEXT 谓词,因为它不是全文索引。”

Titles 表已编入索引,并且 CONTAINS 可以通过简单的搜索正常工作。

有谁知道我做错了什么?内联查询不支持 CONTAIN 查询吗?

此查询正在 SQL Server 2008 中运行。

SELECT pi.PublisherGUID, pi.Publisher, pi.TitleGUID, pi.Title, 
  pi.YearsPublished, pi.FrontImage, pi.IssueGUID, pi.IssueNumber, 
  pi.IssueVariation, pi.IssueNotes, pi.CoverDate, pi.IsForSale 
  FROM (
    SELECT ROW_NUMBER() OVER(ORDER BY PublicIssues.Title,PublicIssues.IssueNumber) AS RowNum, 
      PublicIssues.PublisherGUID, PublicIssues.Publisher, 
      PublicIssues.TitleGUID, PublicIssues.Title, 
      PublicIssues.YearsPublished, PublicIssues.FrontImage, 
      PublicIssues.IssueGUID, PublicIssues.IssueNumber, 
      PublicIssues.IssueVariation, PublicIssues.IssueNotes, 
      PublicIssues.CoverDate, PublicIssues.IsForSale
      FROM (SELECT dbo.tblTitles.PublisherGUID, dbo.tblPublishers.Name AS Publisher, 
            dbo.tblTitles.TitleGUID, dbo.tblTitles.Title, 
            dbo.tblTitles.YearsPublished, dbo.tblIssues.IssueGUID, 
            dbo.tblIssues.IssueNumber, dbo.tblIssues.IssueVariation, 
            dbo.tblIssues.IssueNotes, dbo.tblIssues.CoverDate, 
            dbo.tblStockIssueImages.FrontImage, 
            ci_owner.IssueForSale(dbo.tblIssues.IssueGUID) AS IsForSale
            FROM dbo.tblStockIssueImages RIGHT OUTER JOIN
                dbo.tblIssues ON 
                dbo.tblStockIssueImages.StockIssueImageGUID = dbo.tblIssues.StockIssueImageGUID 
                LEFT OUTER JOIN
                dbo.tblTitles INNER JOIN
                dbo.tblPublishers ON dbo.tblTitles.PublisherGUID = dbo.tblPublishers.PublisherGUID 
                ON dbo.tblIssues.TitleGUID = dbo.tblTitles.TitleGUID
            ) 
    AS PublicIssues
    WHERE 1=1 AND CONTAINS(Title,@xTitle)
  ) AS pi
WHERE RowNum BETWEEN (@xPageNum - 1) * @xPageSize + 1 AND 
@xPageNum * @xPageSize ORDER BY pi.Title
4

1 回答 1

2

事实上,在 PublicIssues 的上下文中,Title 不是全文索引的。

它在表 tblTitles 中被索引。

我认为可以将 CONTAINS 谓词移动到定义 PublicIssues 的表达式中。类似于以下内容。但是我怀疑(有 1=1 的暗示)这个想法是有各种其他标准,并且将所有这些标准都“放在里面”可能是不可行的。它是 [显然] 动态 SQL,通过将搜索条件放置在适当的两个位置之一来制作查询可能是可行的。

  FROM (SELECT dbo.tblTitles.PublisherGUID, dbo.tblPublishers.Name AS Publisher, 
        dbo.tblTitles.TitleGUID, dbo.tblTitles.Title, 
            dbo.tblTitles.YearsPublished, dbo.tblIssues.IssueGUID, 
            dbo.tblIssues.IssueNumber, dbo.tblIssues.IssueVariation, 
            dbo.tblIssues.IssueNotes, dbo.tblIssues.CoverDate, 
        dbo.tblStockIssueImages.FrontImage, 
            ci_owner.IssueForSale(dbo.tblIssues.IssueGUID) AS IsForSale
        FROM dbo.tblStockIssueImages RIGHT OUTER JOIN
                    dbo.tblIssues ON 
                    dbo.tblStockIssueImages.StockIssueImageGUID = dbo.tblIssues.StockIssueImageGUID 
                    LEFT OUTER JOIN
                    dbo.tblTitles INNER JOIN
                    dbo.tblPublishers ON dbo.tblTitles.PublisherGUID = dbo.tblPublishers.PublisherGUID 
                    ON dbo.tblIssues.TitleGUID = dbo.tblTitles.TitleGUID

             WHERE CONTAINS(Title,@xTitle)  --- this lined moved
            ) 
AS PublicIssues
于 2009-11-22T03:49:14.247 回答