with cte as
(select ROW_NUMBER() over (order by id) rownum,* from Idea)
select * from cte
go
--我想用 cte 实现分页
--这个 cte 结果里 rownum 几乎用不上的吧?怎样把它抠出去?
--我希望我的 DataReader 里只有我的表数据,reader[0]即 id - Idea 的第一列。

解决方案 »

  1.   

    你把*替换成你需要的列。暂不至于这么懒吧。不手动写列,只好动态拼接一下declare @col varchar(max)
    select @col=isnull(@col+',','')+name from sys.columns where obejct_id=object_id('idea')
    exec(';with cte as
    (select ROW_NUMBER() over (order by id) rownum,* from Idea)
    select '+@col+' from cte')
      

  2.   

    那你直接
    select * from Idea
    order by id
    好了, 搞那么复杂干吗?
      

  3.   


    如果lz用的不是控件自己的分页方式的话, 这个rownum 在分页上还是必须要有的。 
    否则,不知道按照什么来进行分页啊。如果不需要分页处理。 lz只需要将其去掉即可。 参考。
      

  4.   

    如果楼主可以直接以ID列进行分页的话可以直接双TOP解决select top 10 * from (select  top 20 * from Idea order by id asc) a order by id desc至于只显示需要的列,直接把 * 换成你需要的列名加ROW_NUMBER是给数据一个编号,以编号为分页的依据,这个时候是必要的
      

  5.   


    --动态双TOP写法
    declare @col varchar(300),@sql varchar(max)
    select @col=isnull(@col+',','')+name from syscolumns where id=object_id('Idea')
    set @sql='select top 10 '+@col+' from (select  top 20 '+@col+' from Idea order by id asc) a order by id desc'
    exec(@sql)
      

  6.   

    双 top,喜欢!不知效率怎么样。求解
    页面里会用得上 rownum 么?……谁人用过?