2011-10-15 45 views
2

我不是数据库人员(因为这个问题会显示)。我试图编写一个表值函数,我可以在ASP.NET Web应用程序中使用Linq To Sql。SQL Server 2008 - 使用多个关键字和分页进行全文搜索

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

我想一次显示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 
) 

当我尝试创建此功能SSMS给我“无效的列名称ROWID'”的错误。

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

我希望你们其中一位SQL大师可以指出我朝着正确的方向。

回答

4

您不能引用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 
1

感谢OMG小马 - 这正是我之后。 我修改了函数,以便它还返回匹配行(TotalRows)的总数,现在我应该能够使分页工作。

CREATE FUNCTION SearchBooks 
(
    @keywords nvarchar(50), 
    @skip int, 
    @take int 
) 
RETURNS TABLE 
AS 
RETURN 
(
    SELECT TOP (@take) * FROM 
    (
     SELECT TOP (@take) 
      ROW_NUMBER() OVER (ORDER BY MyFTS.RANK DESC) AS RowID, 
      COUNT(*) OVER(PARTITION BY 1) as TotalRows, 
      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 
) 
相关问题