sql的几个排序函数

1用于排序的函数

row_number()

rank()

dense_rank()

ntile(group_number)

 

下面列举这个函数的用法:

row_number()函数一般用于组内排序,而其他三个函数是对结果集排序

例子:分页排序

<!--注意全局变量也在这里声明,并用逗号隔开-->

create proc MyDividePageSort @iRowCount int ,@iPageNo int

AS

<!--局部变量在这里声明,并要采用关键字-->

declare @iMax int,@strSql nvarchar(100)

<!-并在这里赋值给相应的变量,因为是局部变量,所以必须赋值,但是全局变量的话,可以手动赋值,语句之间不用分隔号,但是独立的执行语句就必须采用go->

set @iMax = @iPageNo * iRowCount

set @strSql = '

select * from (select top('+convert(nvarchar(10),@iRowCount)+' * from 

( select top '+convert(nvarchar(10),@iMax)+' row_number() over(order by id asc) rownumber, * form [pc.pt ]order by id asc ) pcmax order by id desc )pcmin order by id asc    ) '

<!--执行-->

exec(@strSql)

go

这个是2000的过程,从中我们必须可以清楚了解几点:

1果一个变量被申明为string(nvarchar()),那么如果要该可变的unicode字符串里面的变量成功被赋值的话就必须使用:‘++‘

2还要改变该变量的类型convert(nvarchar(10),@iMax),如果这里直接采用'+@iMax+'会报select top (' 转换成数据类型 int 时失败')

这里为什么要用convert:因为如果直接用@IMax的话,相当于将变量@IMax转换成整数,在程序里面我们可以这样写

select top “+varivant+"* from table;

下面是2005的分页动作

create proc mydividePages @iRowcount  int ,@iPageNo int

AS

select * from (select row_number() over(order by id asc )  row,* from sp ) orderdata where row between @ipageNo * @iRowCoount +1 and (@ipageNo +1) * iRowCount;

这里的意思就是:从指定起始的row表中select出结果集来

需要注意的一点就是orderdata,这里必须要别名,因为sql里面只有特殊的函数才允许将2个执行语句放在一起,比如exists,有比如in,加上别名的意思就是相当于一个临时表,这里有不得不提一下CTE查询

with tempCte

{

    one statement can run off its own bat(independently);

}

next ,we can use the tempCte

在做分页测试的时候,我遇到了一个很容易忽略的问题

when a string contains some variants , once the varients changed,the string should be rebuliding;

this string can't get any changs if we don't rebuild it;  

另外一个问题,在编写该测试程序的时候,我第一次采用比较直观的SqlDataReader,这样就会有效率问题,我想维护一个datareader,当窗口关闭的时候再close该DataReader,但是因为每次都要用不同的SqlCommand来实例化该阅读器,因此会造成连接池的问题,必须显示的关闭它,但是如果我们采用SqlDataAdapter的话就不存在该问题啦

剩余几个函数以后用的时候再写

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值