web-dev-qa-db-fra.com

Comment obtenir l'ID de ligne d'une ligne dans le serveur SQL

J'ai une table CSBCA1_5_FPCIC_2012_EES207201222743, ayant deux colonnes employee_id et employee_name

J'ai utilisé la requête suivante

SELECT ROW_NUMBER() OVER (ORDER BY EMPLOYEE_ID) AS ID, EMPLOYEE_ID,EMPLOYEE_NAME 
FROM CSBCA1_5_FPCIC_2012_EES207201222743 

Mais, il renvoie les lignes dans l'ordre croissant de employee_id, mais j'ai besoin des lignes dans l'ordre où elles ont été insérées dans le tableau.

8
Ravi

SQL Server ne suit pas l'ordre des lignes insérées, il n'existe donc aucun moyen fiable d'obtenir ces informations compte tenu de la structure de votre table actuelle. Même si employee_id Est une colonne IDENTITY, il n'est pas infaillible à 100% de s'appuyer sur celle-ci pour l'ordre d'insertion (puisque vous pouvez combler les lacunes et même créer des valeurs d'identification en double à l'aide de SET IDENTITY_INSERT ON). Si employee_id Est une colonne IDENTITYet vous êtes sûr que les lignes ne sont pas insérées manuellement dans le désordre, vous devriez pouvoir utiliser cette variation de votre requête pour sélectionnez les données dans l'ordre, le plus récent en premier:

SELECT 
   ROW_NUMBER() OVER (ORDER BY EMPLOYEE_ID DESC) AS ID, 
   EMPLOYEE_ID,
   EMPLOYEE_NAME 
FROM dbo.CSBCA1_5_FPCIC_2012_EES207201222743
ORDER BY ID;

Vous pouvez modifier votre tableau pour suivre ces informations pour les nouvelles lignes, mais vous ne pourrez pas les dériver pour vos données existantes (elles seront toutes marquées comme insérées au moment où vous effectuez cette modification).

ALTER TABLE dbo.CSBCA1_5_FPCIC_2012_EES207201222743 
-- wow, who named this?
  ADD CreatedDate DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP;

Notez que cela peut casser le code existant qui ne fait que INSERT INTO dbo.whatever SELECT/VALUES() - par exemple vous devrez peut-être revoir votre code et définir une liste de colonnes explicite appropriée.

12
Aaron Bertrand

Il existe une pseudocolonne appelée %% physloc %% qui indique l'adresse physique de la ligne.

Voir équivalent de RowID d'Oracle dans SQL Server

6
robie2011

SQL ne fait pas cela. L'ordre des tuples dans le tableau n'est pas classé par date d'insertion. Beaucoup de gens incluent une colonne qui stocke cette date d'insertion afin de contourner ce problème.

2
Florin Stingaciu