SQL Server 2008 - 具有多个关键字和分页的全文搜索

cja*_*ues 2 c# sql-server full-text-search sql-server-2008

我不是数据库专家(正如这个问题将显示的)。我正在尝试编写一个可以在我的 ASP.NET Web 应用程序中与 Linq To Sql 一起使用的表值函数。

假设我想搜索标题或摘要可能包含多个关键字的书籍(例如“澳大利亚历史”)。

我想一次显示 x 个结果,所以我需要能够告诉我的函数“跳过”和“获取”一定数量的记录。

有些书籍可能会被标记为“已删除”。我不想归还这些。

这是我到目前为止所拥有的:

CREATE FUNCTION SearchBooks
(
    @keywords nvarchar(50),
    @skip int,
    @take int
)
RETURNS TABLE
AS
RETURN
(
  SELECT TOP (@take)
         ROW_NUMBER() OVER (ORDER BY MyFTS.RANK DESC) AS RowID,
         MyFTS.RANK as Relevance,
         [ID],
         [Title],
         [Summary]
    FROM [Book]
    JOIN CONTAINSTABLE ([Book], ([Title], [Summary]), @keywords, @take) AS MyFTS ON MyFTS.[KEY] = [Book].[ID]
   WHERE ([Book].[Deleted] = 0) 
     AND (MyFTS.[RowID] BETWEEN (@skip + 1) AND (@skip + @take))
ORDER BY MyFTS.RANK DESC
)
Run Code Online (Sandbox Code Playgroud)

当我尝试创建此函数时,SSMS 给我错误“无效的列名 'RowID'”。

我想我还需要获取匹配记录的总数,以便设置分页?

我希望你们中的一位 SQL 专家可以指出我正确的方向。

OMG*_*ies 5

您不能在 WHERE 子句中引用列别名 - 使用内联视图/派生表:

  SELECT x.rowid,
         x.relevance,
         x.id,
         x.title,
         x.summary
   FROM (SELECT TOP (@take)
                ROW_NUMBER() OVER (ORDER BY MyFTS.RANK DESC) AS RowID,
                MyFTS.RANK as Relevance,
                [ID],
                [Title],
                [Summary]
           FROM [Book] b
           JOIN CONTAINSTABLE ([Book], ([Title], [Summary]), @keywords, @take) AS MyFTS ON MyFTS.[KEY] = b.id
          WHERE b.[Deleted] = 0) AS x
    WHERE x.[RowID] BETWEEN (@skip + 1) AND (@skip + @take))
ORDER BY x.relevance DESC
Run Code Online (Sandbox Code Playgroud)