2011-10-15 49 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 
) 
相關問題