2011-04-18 47 views
2

我必須遷移SQL才能在Microsoft SQL Server 2000上工作。不幸的是,當前的SQL使用的功能ROW_NUMBER()在此版本中尚不受支持。所以我必須找到類似的東西。消除SQL 2000的ROW_NUMBER()

我下面的SQL(我用*,而不是列出所有列)

SELECT [Id], ROW_NUMBER() OVER (ORDER BY InstallmentNumber, ID ASC) AS ROWID 
FROM [ARAS].[ARAS].[Movement] 
+0

查詢的其餘部分在做什麼?它是否使用ROWID進行迭代?如果是這樣,可以有其他方法來處理這個問題。 – SQLMason 2011-04-18 16:27:19

+0

是的。基本上它使用RowId來過濾數據。這個想法是總結所有以前的總價值。 選擇選擇與以下列'(SELECT SUM(總)WHERE RowId <= currentRowId)AS平衡' – Towa 2011-04-18 17:28:30

+0

請參閱我編輯的答覆。 – SQLMason 2011-04-18 18:16:52

回答

3

使用臨時表與標識列以模擬ROW_NUMBER可能是您最好的選擇明智表現:

CREATE TABLE #tmpRowNum (
    ROWID INT IDENTITY(1,1), 
    ID INT 
) 

INSERT INTO #tmpRowNum 
    (ID) 
    SELECT ID 
     FROM [ARAS].[ARAS].[Movement] 
     ORDER BY InstallmentNumber, ID 
+1

不幸的是不能保證... http://stackoverflow.com/q/4219201/27535 – gbn 2011-04-18 16:37:39

+0

但是,這不工作在像上面這樣的單一選擇,是嗎?我想沒有辦法阻止使用更復雜的存儲過程。 – Towa 2011-04-18 17:33:04

+0

除了上面的示例使用的連接/進程/ spid是唯一的臨時表之外,其他人都不能影響它。您將始終通過這種方式獲得連續的值流。 – 2011-04-18 17:35:14

0

不太清楚,但這裏有一個出發點:

SELECT [Id], 
    (SELECT SUM(1) 
    FROM [ARAS].[ARAS].[Movement] 
    WHERE InstallmentNumber <= OuterMovement.InstallmentNumber 
     AND ID <= OuterMovement.ID 
) AS ‘Row Number’ 
FROM [ARAS].[ARAS].[Movement] AS OuterMovement 
+0

SUM(1),那是做什麼的? – Magnus 2011-04-18 16:33:50

+0

似乎無法正常工作 – Towa 2011-04-18 17:34:26

0

您可以創建一個變量表「ROWID」是一個INT標識值並將值插入該值。

您還可以使用ROWID進行操作。雖然性能不會太好...

DECLARE @id INT, @SUM INT 
SELECT @id = MIN([Id]) FROM [ARAS].[ARAS].[Movement]  


WHILE EXISTS (SELECT [Id] FROM [ARAS].[ARAS].[Movement] WHERE [Id] >= @id) 
BEGIN 
    ... do something with the ID .. 
    SELECT @SUM = SUM(...) FROM [ARAS].[ARAS].[Movement] WHERE [Id] > @id 

    SELECT @id = MIN([Id]) FROM [ARAS].[ARAS].[Movement] WHERE [Id] > @id 
END