SQL Server行号和过滤结果

hor*_*ace 4 sql-server row-number

我有一个需要在列表中显示数据“页面”的应用程序。基本想法是相当普遍的。显示屏显示项目列表,显示屏底部是一些控件,可让您转到数据的下一个“页面”。

一切都很好。我有这个工作。

以下是我用来支持“下一个”行为的视图中的SQL。

CREATE VIEW CampaignParticipants AS
SELECT  row_number() OVER (ORDER BY TPT.LastName, TPT.FirstName, TPT.DoB) AS RowNumber
        ,CGP.*
        ,TPT.*
FROM    tblCampaignGEDPush CGP
JOIN    tblParticipants TPT
ON      CGP.PartID = TPT.PartID
Run Code Online (Sandbox Code Playgroud)

这是我使用VIEW的方式

SELECT  *
FROM    CampaignParticipants
WHERE   RowNumber >= 0
AND     RowNumber <= 100
Run Code Online (Sandbox Code Playgroud)

这模拟了从VIEW抓取100个结果的“第一页”。通过每组结果的页面只是桃色。

很棒。但是:

正如一些处理过此问题的人可能知道的那样,这是有缺陷的。如果我想继续搜索TPT.LastName like 'R%'并获得第一组结果,那我就注定了。

我将要开始查看,在处RowNumber = 0停止RowNumber = 100,但“ R”结果可能会超出该范围。结果:列表返回为空。

而且它变得更加棘手:用户希望能够“过滤” LastName,FirstName,DoB,Location,Phone,Zip等任何内容。

**编辑:我真的不能将过滤器放在“内部”查询中,因为它在视图中,并且过滤器可以任意更改

任何人有任何想法如何得到这个结果集有一个row_number()过滤的结果集?

Mat*_*eld 5

这样的事情应该做...

SELECT * FROM (
SELECT  *, ROW_NUMBER() OVER (ORDER BY LastName, FirstName, DoB) AS __RN
FROM    CampaignParticipants
WHERE   LastName LIKE 'R%') innerData WHERE __RN BETWEEN 1 and 100
Run Code Online (Sandbox Code Playgroud)

但是,您应该使用列名,而不是'*'。我不知道您的桌子是什么样子,所以我无法为您填写。