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