web-dev-qa-db-fra.com

Comment extraire la dernière ligne insérée dans SQL Server?

Lorsqu'une instruction d'insertion est exécutée, une ou plusieurs lignes sont insérées dans la table, existe-t-il un moyen d'extraire la dernière ligne insérée dans SQL Server?

7
user2493976

Par définition, une table est un sac de lignes non ordonné ( voir # 3 ici ). Il n'y a aucun moyen de demander à SQL Server quelle ligne a été insérée en dernier sauf vous le faites dans le même lot que l'insertion. Par exemple, si votre table a une colonne IDENTITY, vous pouvez utiliser SCOPE_IDENTITY() (ne jamais utiliser @@IDENTITY, Car cela peut ne pas être fiable si vous ont ou ajouteront des déclencheurs à la table source):

INSERT dbo.table(column) SELECT 1;
SELECT SCOPE_IDENTITY();

Plus généralement, vous pouvez utiliser la clause OUTPUT, qui ne repose pas sur une colonne IDENTITY (mais il sera toujours difficile d'identifier les lignes identifiées par la clause s'il n'y en a pas). PK):

INSERT dbo.table(column) OUTPUT inserted.* SELECT 1;

Si vous ne parlez pas du même lot, la seule véritable façon d'identifier la dernière ligne insérée consiste à utiliser une colonne date/heure dans laquelle l'horodatage d'insertion est enregistré. Sinon, c'est comme si vous aviez vidé un sac de billes par terre, puis demandé à quelqu'un d'entrer dans la pièce et d'identifier celle qui avait touché le sol en dernier.

Vous pouvez être tenté ou même conseillé d'utiliser la fonction IDENT_CURRENT() , mais J'explique ici pourquoi ce n'est pas fiable aussi.

Vous pouvez ajouter une colonne pour suivre cette évolution:

ALTER TABLE dbo.table ADD DateInserted DEFAULT CURRENT_TIMESTAMP;

Vous pouvez maintenant trouver les dernières lignes insérées simplement:

;WITH x AS (SELECT *, r = RANK() OVER (ORDER BY DateInserted DESC)
   FROM dbo.table)
SELECT * FROM x WHERE r = 1;

(Si vous ne voulez pas de liens, vous pouvez ajouter une colonne de départage au ORDER BY, Ou vous pouvez simplement changer RANK() en ROW_NUMBER() si vous ne le faites pas ' ne vous souciez pas des rangées liées que vous obtenez.)

Vous pouvez faire l'hypothèse que la dernière ligne insérée est la valeur d'identité la plus élevée, mais ce n'est pas nécessairement le cas. L'identité peut être réamorcée et peut également être remplacée à l'aide de SET IDENTITY_INSERT ON;.

16
Aaron Bertrand