Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
消除SQL 2000的行数()_Sql_Sql Server 2000_Row Number - Fatal编程技术网

消除SQL 2000的行数()

消除SQL 2000的行数(),sql,sql-server-2000,row-number,Sql,Sql Server 2000,Row Number,我必须迁移sql才能在Microsoft sql Server 2000上工作。不幸的是,当前sql使用的函数ROW_NUMBER()在此版本中尚不受支持。因此,我必须找到类似的东西 在我的SQL下面(我使用*而不是列出所有列) 不太确定,但这里有一个起点: SELECT [Id], ( SELECT SUM(1) FROM [ARAS].[ARAS].[Movement] WHERE InstallmentNumber <= OuterMovement.Install

我必须迁移sql才能在Microsoft sql Server 2000上工作。不幸的是,当前sql使用的函数ROW_NUMBER()在此版本中尚不受支持。因此,我必须找到类似的东西

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


不太确定,但这里有一个起点:

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
选择[Id],
(选择总和(1)
来自【阿拉斯】【阿拉斯】【运动】

其中InstallmentNumber使用带有标识列的临时表来模拟行号可能是最佳性能选择:

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

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

您可以创建一个变量表,为“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

查询的其余部分在做什么?是否使用ROWID进行迭代?如果是,可能还有其他方法来处理。是的。基本上,它使用ROWID来过滤数据。其思想是对所有以前的总值求和。在Select中选择以下列
(Select sum(total))其中RowId,但它不能在上述单一选择中工作,是吗?我想没有办法阻止使用更复杂的存储过程。除了上面的示例使用的是连接/进程/spid唯一的临时表之外,没有其他人可以影响它。通过这种方式,您将始终获得连续的值流。
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