2010-11-02 11 views
9

J'ai une requête qui me permet d'obtenir des enregistrements d'une table de base de données en lui donnant une limite minimum et maximum.SQL Server ROW_NUMBER() sur SQL Server 2000?

Il va comme ceci:

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; 

Maintenant, cela fonctionne comme le ciel sur la base de données SQL Server 2005 et SQL Server 2008, mais a tenté de l'exécuter sur un SQL Server 2000 et dit:

ROW_NUMBER c'est un nom de fonction inconnu ou quelque chose comme ça.

Que puis-je faire ??

Répondre

4

Utilisez une autre fonction ou mettez à niveau votre base de données. ROW_NUMBER n'existait pas dans la version 2000 de la base de données. Point. Vous ne pouvez rien y faire.

+4

cela ne semble pas très utile. il sait évidemment que ce n'est pas en 2000, le message d'erreur lui dit cela. –

+1

@nathan gonzalez: c'est vraiment la vérité de base cependant: il n'y a pas de substitut élégant – gbn

+0

Exactement. Downvoting parce que vous n'aimez pas la vérité n'est pas utile non plus, vous savez. c'est la vérité. La fonction a été introduite après 2000 car elle était manquante. Il n'y a pas de substitut de performance identique. – TomTom

11
  • Il y a un COUNT (*) avec SELF REJOIGNEZ solution here qui échelle mal
  • Vous pouvez charger une table temporaire avec une colonne IDENTITY et lire, mais il est pas garanti (ne peut pas trouver l'article à ce sujet, a dit à un séminaire il y a des années MS)

Aucune solution soutiendra PARTITION PAR

Je n'ai pas parlé des solutions à base de boucles ou Cursor sont probablement pires

Modifier le 20 mai 20011

Exemple de démonstration pourquoi IDENTITÉ ne fonctionnera pas:
Do Inserted Records Always Receive Contiguous Identity Values

+1

+1: La COUNT/self join ressemble plus à RANK/DENSE_RANK car les doublons auront la même valeur –

+0

@OMG Ponies: bon point, j'avais oublié que ça fait si longtemps :-) – gbn

+0

"Aucune solution ne supportera PARTITION PAR". Vous pouvez GROUP BY lors du chargement de la table temporaire. Puis ajoutez l'IDENTITÉ pour obtenir l'identifiant de chaque groupe. Vous pouvez ensuite joindre cette table temporaire à votre requête d'origine. – jumxozizi

3

Je sais que ce fil est un peu vieux, mais pour tous ceux qui cherchent d'autre pour une même solution, je pense que ce sera utile savoir qu'il existe une bonne solution à ce problème.

S'il vous plaît voir le lien d'origine here

Pour ceux qui ne veulent pas cliquer sur le lien, je l'ai copié et collé le code ci-dessous. Encore une fois, le crédit va à original publisher

Voici le SQL ci-dessous pour SQL Server 2000 pour sélectionner la dernière version d'un regroupement d'enregistrements par une seule colonne.

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 

Même code dans SQL Server 2005 pourrait ressembler à ceci:

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

Ceci est ma solution au problème:

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 [email protected], @[email protected]+1 
select * from @t 

Explication:

  1. créer un table de mémoire
  2. insérer les données (votre requête) avec le numéro de ligne 0
  3. mettre à jour le champ de numéro de ligne avec une variable int qui est incrémentée dans la même mise à jour pour l'enregistrement suivant (en fait, la variable est incrémentée d'abord, puis mise à jour à partir de 1)
  4. "sélectionnez" le résultat de la table de mémoire.

Vous pouvez demander pourquoi je n'utilise pas la variable dans l'instruction select? Ce serait plus simple mais ce n'est pas autorisé, seulement s'il n'y a pas de résultat. C'est bien de le faire dans une mise à jour.

+0

S'il vous plaît expliquer ce que vous faites là – winklerrr