Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SQL Server 2008-具有多个关键字和分页的全文搜索_C#_Sql Server_Sql Server 2008_Full Text Search - Fatal编程技术网

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

C# SQL Server 2008-具有多个关键字和分页的全文搜索,c#,sql-server,sql-server-2008,full-text-search,C#,Sql Server,Sql Server 2008,Full Text Search,我不是一个数据库专家(这个问题会说明)。我正在尝试编写一个表值函数,可以在ASP.NET web应用程序中与Linq to Sql一起使用 假设我想搜索标题或摘要可能包含许多关键词的书籍(例如“澳大利亚历史”) 我希望一次显示x个结果,因此我需要能够告诉我的函数“跳过”和“获取”一定数量的记录 有些书可能被标记为“已删除”。我不想退回这些 以下是我目前掌握的情况: CREATE FUNCTION SearchBooks ( @keywords nvarchar(50), @ski

我不是一个数据库专家(这个问题会说明)。我正在尝试编写一个表值函数,可以在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
)
当我尝试创建此函数时,SSMS会给出错误“无效列名'RowID'”

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


我希望你们中的一位SQL专家能为我指明正确的方向。

您不能在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

谢谢我的小马,这正是我想要的。 我已经修改了这个函数,这样它也会返回匹配行的总数(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
)