惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

S
Secure Thoughts
罗磊的独立博客
T
The Blog of Author Tim Ferriss
人人都是产品经理
人人都是产品经理
博客园 - 叶小钗
Last Week in AI
Last Week in AI
美团技术团队
Google Online Security Blog
Google Online Security Blog
Application and Cybersecurity Blog
Application and Cybersecurity Blog
D
Docker
G
Google Developers Blog
大猫的无限游戏
大猫的无限游戏
酷 壳 – CoolShell
酷 壳 – CoolShell
小众软件
小众软件
月光博客
月光博客
L
LINUX DO - 最新话题
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
W
WeLiveSecurity
H
Heimdal Security Blog
Vercel News
Vercel News
SecWiki News
SecWiki News
Forbes - Security
Forbes - Security
Blog — PlanetScale
Blog — PlanetScale
Google DeepMind News
Google DeepMind News
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
www.infosecurity-magazine.com
www.infosecurity-magazine.com
TaoSecurity Blog
TaoSecurity Blog
T
Troy Hunt's Blog
A
About on SuperTechFans
C
Check Point Blog
S
Security Affairs
Hacker News - Newest:
Hacker News - Newest: "LLM"
AI
AI
WordPress大学
WordPress大学
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Help Net Security
Help Net Security
博客园_首页
The Last Watchdog
The Last Watchdog
S
SegmentFault 最新的问题
Hugging Face - Blog
Hugging Face - Blog
Security Archives - TechRepublic
Security Archives - TechRepublic
Engineering at Meta
Engineering at Meta
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
I
Intezer
K
Kaspersky official blog
M
MIT News - Artificial intelligence
J
Java Code Geeks
G
GRAHAM CLULEY
P
Palo Alto Networks Blog

博客园 - 使名扬

vs.net 2005 C# WinForm GroupBOX 的BUG?尝试读取或写入受保护的内存。这通常指示其他内存已损坏 windows2003双网卡安装openmeetings成功后登录页空白 access top order by的逻辑问题 解决vs2005中文乱码问题 登录失败:用户帐户限制。可能的原因包括不允许空密码,登录时间限制,或强制的策略限制。 - 使名扬 - 博客园 gridview中如何添加对某行删除时的确认提示框 DataList父子嵌套 VS2008 母版页嵌套母版页,下级母版页不执行Page_Load解决方法 - 使名扬 - 博客园 360会导致MSDN "无法显示该网页" - 使名扬 - 博客园 asp.net下使用FCKeditor 2.6.6 in ,exists ,join sql server 2000中了解各表的记录数 oracle树形sql查询 谨慎使用windows 2003 64位版 带日期,时间和闰年验证的正则式 关于vs.net 2003向vs.net 2005迁移后,注册事件丢失,"并不包含...的定义" 的解决方法 - 使名扬 走进非洲,发现全错了-关于sqlserver2000下全球化网站生僻语种sql查询的解决方案 BUGReport:datagrid带模板列绑定空数据集出错的问题 Asp.net 2.0 Webpart 数据库的迁移
MSDN上关于sqlserver 万能分页原理实现的一个致命错误
使名扬 · 2007-06-26 · via 博客园 - 使名扬

      记得3,4年前我写oracle万能分页控件,那个时候还是有很多读者的。4年后再来谈分页控件。(实在太忙,也很久没有来博客园了),自己都觉得过时了。而且我要批判的还是MSDN上的经典文章(4年前我写oracle万能分页就是参考了这篇文章)

        一直以来我都认为MSDN上的文章是经典的,微软出来的代demo码也是相当严谨的。
但是对于这个sqlserver万能分页控件4年来我一直很怀疑。(因为我都是用oracle的,所以很少用这个控件)
        最近在埃塞实在是没事可做了。又翻出这个文章来看。

关于以sql语句作为参数的万能分页方法有不少。
有的是
select Top(@PageSize) from TableName where ID Not IN 
(Select Top ((@PageIndex-1)*@PageSize)  ID from Table Name where .... order by ... )
where .... order by ...
但是Not in一用,性能极差。


在Dino Esposito 《Creating a Pager Control for ASP.NET》一文中所用的sql组合我现在还是比较认可。
SELECT * FROM
(SELECT TOP ItemsPerPage * FROM
(SELECT TOP ItemsPerPage*CurrentPageIndex * FROM
(SelectCommand) AS t0
ORDER BY SortField ASC) AS t1
ORDER BY SortField DESC) AS t2
ORDER BY SortField

但是他最大的错误在于它居然是用下面这段代码来实现的。
private string QueryPageCommandText = "SELECT * FROM " +
"(SELECT TOP {0} * FROM " +
"(SELECT TOP {1} * FROM ({2}) AS t0 ORDER BY {3} {4}) AS t1 " +
"ORDER BY {3} {5}) AS t2 " +
"ORDER BY {3}";


string cmdText = String.Format(QueryPageCommandText,
recsToRetrieve, // {0} --> page size
ItemsPerPage * (CurrentPageIndex + 1), // {1} --> size * index
SelectCommand, // {2} --> base query
SortField, // {3} --> key field in the query
"ASC",  // Default to ascending order
"DESC");

对于只一个sort field的简单sql没有错。但对于复杂的就有问题
比如以Northwind的一个sql为例
SELECT  Employees.LastName, Employees.FirstName,
                              Orders.OrderID
                        FROM Employees INNER JOIN
                              Orders ON
                              Employees.EmployeeID = Orders.EmployeeID
                        ORDER BY Orders.OrderID,Employees.FirstName

依据原理的本意 ORDER BY SortField DESC) AS t2
实现后应该是
ORDER BY OrderID desc, FirstName desc)AS t2

然按照demo控件,只是简单替换的话,实现后是
ORDER BY OrderID ,FirstName desc)AS t2
最后的结果并不符合SQL的原意。