0

我正在尝试使用 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
4

1 回答 1

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 中的一个神奇咒语,它只分配数字,而不实际进行排序。

顺便说一句,当您进行插入时,您应该始终在插入语句中指定列。

此外,WHILE 循环很有可能被重写为查询,从而使一切变得更加高效(并非总是如此,但有时)。

于 2012-05-30T02:43:05.873 回答