SQL Server 2000上的SQL Server ROW_NUMBER()?

时间:2010-11-02 20:20:26

标签: sql sql-server sql-server-2000

我有一个查询,允许我通过给出最小和最大限制来从数据库表中获取记录。

它是这样的:

  SELECT T1.CDUSUARIO, T1.DSALIAS, T1.DSNOMBRE_EMPRESA, T1.DSCARGO, T1.DSDIRECCION_CORREO, T1.CDUSUARIO_ADMINISTRADOR, T1.FEMODIFICACION 
    FROM (SELECT *, 
               ROW_NUMBER() OVER (ORDER BY CDUSUARIO) as row FROM TBL_USUARIOS ) as T1 
   WHERE row > @limiteInf 
     and row <= @limiteSup 
ORDER BY DSALIAS ASC;

现在,它在SQL Server 2005和SQL Server 2008上就像天堂一样,但是试图在SQL Server 2000数据库上运行它并说:

  

ROW_NUMBER这是一个未知的函数名称或类似的东西。

我该怎么办?

4 个答案:

答案 0 :(得分:11)

  • 有一个COUNT(*),SELF JOIN解决方案here会严重缩放
  • 您可以加载带有IDENTITY列的临时表并回读,但不保证无法正常工作(找不到文章,多年前曾在MS研讨会上讲过)

两种解决方案都不支持PARTITION BY

我没有提到基于循环或基于CURSOR的解决方案可能更糟

编辑20011年5月20日

为什么IDENTITY不起作用的示例演示:
Do Inserted Records Always Receive Contiguous Identity Values

答案 1 :(得分:4)

使用其他功能或升级您的数据库。 ROW_NUMBER在2000版本的数据库中不存在。点。你无能为力。

答案 2 :(得分:4)

我知道这个帖子有点旧,但对于其他寻找相同解决方案的人来说,我认为知道这个问题有一个很好的解决方案会很有用。

请参阅原始链接here

对于那些不想点击链接的人,我复制并粘贴了以下代码。再次归功于original publisher

以下是SQL Server 2000的SQL,用于通过单个列选择最新版本的记录分组。

SELECT *
  FROM (
    SELECT *, (
      SELECT COUNT(*)
        FROM MyTable AS counter
      WHERE counter.PartitionByColumn = MyTable.PartitionByColumn
        AND  counter.OrderByColumn >= MyTable.OrderByColumn
      ) AS rowNumber
    FROM MyTable
  ) AS r1
  WHERE r1.rowNumber = 1

SQL Server 2005中的相同代码如下所示:

SELECT * FROM (SELECT *, ROW_NUMBER() OVER(PARTITION BY PartitionByColumn 
    ORDER BY OrderByColumn DESC) AS rowNumber FROM MyTable) AS rw1 
  WHERE rw1.rowNumber = 1

答案 3 :(得分:-1)

这是我解决问题的方法:

declare @i int
declare @t table (row int, stuff varchar(99))
insert into @t
select 0,stuff from mytable -- <= your query
set @i=0
update @t set row=@i, @i=@i+1
select * from @t

说明:

  1. 创建一个记忆表
  2. 插入数据(您的查询),行号为0
  3. 使用int变量更新行号字段,该变量在下一条记录的相同更新中递增(实际上变量先增加然后更新,因此它将从1开始)
  4. “选择”内存表中的结果。
  5. 你可能会问,为什么我不在select语句中使用变量?它会更简单,但只有在没有结果的情况下才允许。可以在更新中执行此操作。