简单集合枚举的 MS SQL row_number/rank 替代方案
Posted
技术标签:
【中文标题】简单集合枚举的 MS SQL row_number/rank 替代方案【英文标题】:MS SQL row_number/rank alternative for simple set enumeration 【发布时间】:2012-05-30 00:25:00 【问题描述】:我正在尝试使用 row_number 或 rank 来插入行号,这样我就可以在不使用游标的情况下枚举临时表。这两个函数都给我错误“'rank'附近的语法不正确,预期'OVER'”。我不需要 OVER 提供的所有功能 + 性能影响 - 我一点也不关心订单/排名等。我确定我以前做过,但那是几年前的事了,有人能指点我吗到正确的功能?
declare @SomeTempTable table (RowNum int NOT NULL, SomeField int NOT NULL);
insert into @SomeTempTable
select rank() as RowNum, SomeField
from SomeTable
declare @RowNum int = 1;
declare @NumRows int = (select max(RowNum) from @SomeTempTable);
while@RowNum <= @NumRows
begin
declare @SomeField int;
select @SomeField = SomeField
from @SomeTempTable
where RowNum = @RowNum;
--TODO: Do stuff
set @RowNum = @RowNum + 1;
END
【问题讨论】:
【参考方案1】:嗯,你无法决定 SQL 函数的语法,即使它对你很有吸引力。
有两种方法可以得到你想要的。第一种是标准方法,根本不使用windows函数:
declare @SomeTempTable table (
RowNum int identity(1,1) not null,
SomeField int NOT NULL
);
insert into @SomeTempTable(SomeField)
select SomeField
from SomeTable
瞧!让身份发挥作用。
第二个是你采取的方法:
insert into @SomeTempTable(RowNum, SomeField)
select row_number() over (order by (select NULL)) as RowNum, SomeField
from SomeTable
“order by (Select NULL)”似乎是 SQL Server 中的一个神奇咒语,它只分配数字,而不实际进行排序。
顺便说一句,当您执行插入操作时,您应该始终在插入语句中指定列。
此外,WHILE 循环很有可能被重写为查询,从而使一切变得更高效(并非总是如此,但有时)。
【讨论】:
我并不是要暗示我想改变函数的语法。我是说我以前做过这件事而没有做那件事,并希望能复习一下。谢谢!以上是关于简单集合枚举的 MS SQL row_number/rank 替代方案的主要内容,如果未能解决你的问题,请参考以下文章
(Ms Access) Row_Number() Over Partition
SQL2012分页offset fetch 比较SQL2005/2008的ROW_Number