日期:2014-05-18  浏览次数:20786 次

关于在SQL2005中分页的问题
数据库中有三张表A、B、C,我要联合查询这张表,查询有过滤条件,这条语句是执行成功的,如下
SQL code

SELECT IP_PoolV4.ID,IP_PoolV4.IP,IP_PoolV4.Used,IP_PoolV4.Area,IP_PoolV4._UserName,IP_PoolV4.Note,IP_PoolName.ID AS PoolID,IP_PoolName.Name AS PoolName,IP_PoolName.Gateway,IP_PoolName.Mask,IP_PoolName.Type,IP_PoolName.HostID,IP_Host.Name AS HostName FROM IP_PoolV4 INNER JOIN IP_PoolName ON IP_PoolV4.PoolID = IP_PoolName.ID INNER JOIN IP_Host ON IP_PoolName.HostID = IP_Host.ID


这个语句查询出来的记录很多,我需要分页,于是我建了个存储过程。我的思路是,存储过程先执行以上语句,生成一个临时表,然后我再用Count(*)统计这张临时表的记录数(这是分页所必须的),然后我再用Row_Number()函数对这个临时表的记录进行编号,然后分页,据说WITH AS生成的临时表效率很高,于是有了如下代码:
SQL code

WITH TT AS ( @sql ) (伪代码,@sql代表上面的SQL语句)
SELECT * FROM (SELECT *,Row_Number() OVER (ORDER BY ID) AS RowNo FROM TT ) AS T2 WHERE RowNo BETWEEN 1 AND 50;
Select Count(*) As TC FROM TT;



代码没有问题,但是TT表只在紧跟后的一条语句有效,第二句就不行了,我看网上有专家说,WITH AS 语句后如果全是SELECT语句,那么这临时表就是有效的,直到遇到其它语句。

------解决方案--------------------
探讨

对,必须要跟个select。
引用:
数据库中有三张表A、B、C,我要联合查询这张表,查询有过滤条件,这条语句是执行成功的,如下

SQL code

SELECT IP_PoolV4.ID,IP_PoolV4.IP,IP_PoolV4.Used,IP_PoolV4.Area,IP_PoolV4._UserName,IP_PoolV4.Note,IP_P……

------解决方案--------------------
探讨

那我这种需求怎么解决呢

------解决方案--------------------

探讨

对,必须要跟个select。
引用:
数据库中有三张表A、B、C,我要联合查询这张表,查询有过滤条件,这条语句是执行成功的,如下

SQL code

SELECT IP_PoolV4.ID,IP_PoolV4.IP,IP_PoolV4.Used,IP_PoolV4.Area,IP_PoolV4._UserName,IP_PoolV4.Note,IP_P……

------解决方案--------------------
SQL code
With 只有在紧跟着的下一条语句才有效果