SQL Server ROW_NUMBER () на SQL Server 2000? - PullRequest
9 голосов
/ 02 ноября 2010

У меня есть запрос, который позволяет мне получать записи из таблицы базы данных, задавая ей минимальный и максимальный лимит.

Это выглядит так:

  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 ]

11 голосов
/ 02 ноября 2010
  • Существует COUNT (*) с решением SELF JOIN здесь , которое плохо масштабируется
  • Вы можете загрузить временную таблицу со столбцом IDENTITY и прочитать обратно, но она не гарантированно сработает (не могу найти статью об этом, об этом говорили на семинаре MS много лет назад)

Ни одно из решений не будет поддерживать PARTITION BY

Я не упомянул решения на основе циклов или CURSOR, которые, вероятно, хуже

Изменить 20 мая 20011

Пример демонстрации того, почему IDENTITY не будет работать:
Всегда ли вставленные записи получают непрерывные значения идентификаторов

4 голосов
/ 02 декабря 2014

Я знаю, что эта тема немного устарела, но для всех, кто ищет такое же решение, я думаю, будет полезно узнать, что есть хорошее решение для этой проблемы.

Пожалуйста, смотрите оригинальную ссылку здесь

Для тех, кто не хочет нажимать на ссылку, я скопировал и вставил код ниже.Опять же, кредит идет на оригинального издателя

Ниже приведен SQL для SQL Server 2000, чтобы выбрать последнюю версию группировки записей по одному столбцу.

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
4 голосов
/ 02 ноября 2010

Используйте другую функцию или обновите вашу базу данных. ROW_NUMBER не существовало еще в версии базы данных 2000 года. Точка. С этим ничего не поделаешь.

0 голосов
/ 24 марта 2017

Это мое решение проблемы:

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. «выберите» результат из таблицы памяти.

Вы можете спросить, почему я не использую переменную в операторе выбора?Было бы проще, но это не разрешено, только если нет результата.Это нормально делать в обновлении.

...