我正在尝试使用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
答案 0 :(得分:0)
嗯,你不能决定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中一个神奇的咒语,只是分配数字而不实际进行排序。
另外,当您执行插入操作时,应始终在insert语句中指定列。
此外,很有可能WHILE循环可以重写为查询,使一切更有效(并非总是如此,但有时)。