[英]MS SQL row_number/rank alternative for simple set enumeration
我試圖使用row_number或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
嗯,即使它很吸引人,您也不必決定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
在SQL Server中,“按...排序(選擇NULL)”似乎是一種神奇的咒語,它只分配數字,而不實際進行排序。
順便說一句,當您執行插入操作時,應始終在插入語句中指定列。
同樣,很可能WHILE循環可以被重寫為查詢,從而使所有工作效率更高(並非總是如此,但有時)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.