微软从SQL SERVER 2005开始提供了一个函数:row_number(),用来生成行号。
它可以按指定字段进行排序,为查询结果集生成行号,还可以指定分组字段,对查询结果集进行分组后为每组从1开始生成行号。
它的语法:
1、不分组的方式:ROW_NUMBER() OVER (ORDER BY [排序字段名] DESC)
2、按指定字段分组的方式:ROW_NUMBER () OVER (PARTITION BY [分组字段名] ORDER BY [排序字段名] )
不分组方式的使用相对简单,我们也简单地举个例子。
首先,创建一个表:
create table TestTable(Name varchar(20),Duty varchar(10),InDate datetime,Remark varchar(200))
然后从药博士软件的员工表中导入一些数据:
insert into TestTable
select Name,Duty,CreatTime,Remark
from Employees
where Duty<>''
再通过一条查询语句来展示row_number()函数的用法:
select ROW_NUMBER() OVER (ORDER BY [InDate] DESC) as RecID,* from TestTable
效果见下图:

分组的方式稍微复杂一些。下面,通过药博士医药软件中一个具体的需求来展示此函数的实际应用。
需求:根据商品类别编号重新生成商品编号。
规则:类别编号+序号。
类别编号定长4位,不足4位的在右边补0,序号定长4位,不足4位的在左边补0。
实现代码:
按规则生成新商品编号,并将商品资料导入到一个临时表:tempGoods
select left(K.KindNo+'0000', 4)
+ REPLACE(str(row_number() over (partition by left(K.KindNo+'0000', 4) order by left(K.KindNo+'0000', 4) asc), 4),' ', '0') as NewGoodsID
,G.*
into tempGoods
from Goodses G
join MainKinds K on G.MainKind = K.KindID and G.MainKind>0
order by K.KindNo
生成的数据截图:





