2011-01-11 4 views
3

Comment puis-je obtenir Dernière ligne insérée dans la table il n'y a pas de colonne Uniqueidentifier or identity.Comment obtenir la dernière ligne insérée dans le serveur SQL

J'attends vos bonnes idées.

+1

Bien que ce soit juste mon opinion, je crois que chaque table devrait avoir un ID unique, même si elle n'est pas utilisée par l'application elle-même. Faire les choses de cette façon résoudrait votre problème. – saret

+1

À moins que la table n'ait pas d'index, vous ne pouvez pas. Puis-je demander pourquoi vous voulez le dernier enregistrement? –

+1

@saret lorsque l'identificateur unique est utilisé, il n'est toujours pas possible d'obtenir le dernier enregistrement –

Répondre

4

Vous avez besoin d'un moyen d'être en mesure d'identifier l'ordre des lignes pour le déterminer. Quelque chose comme une "date de création" ou une colonne IDENTITY.

2

Vous ne pouvez pas. Une table est constituée d'un ensemble de lignes non ordonnées *. Si vous avez besoin de savoir, par exemple, lorsqu'une ligne a été insérée, vous devez ajouter cette information dans la définition de la table (en ajoutant une nouvelle colonne) et la remplir correctement.

* même face à un index clusterisé, il est plus sain de toujours de considérer une table comme étant un ensemble de lignes non ordonnées. Un index clusterisé est utile, mais il ne garantit aucun ordre physique particulier (comme dans le commentaire de Martin à cette réponse)

+0

Les lignes d'une même page ne sont pas nécessairement classées par index cluster. La liste des offsets de lignes est incorrecte. c'est-à-dire si une page entière a des lignes avec les valeurs clés '1,2,3,5,6' et que' 1' est supprimé et que '4' est inséré cela ne réorganisera pas toute la page il va juste coller' 4' où ' 1' était et mettre à jour la liste des offsets de ligne. –

+0

@Martin - bien sûr, vous avez raison. Je me trompais. –

0

Ne croyez pas que vous le pouvez. Vous aurez besoin d'une sorte d'identifiant pour extraire des données. ID, DateTime .. tout ce qui sera toujours différent des autres.

2

Si vous souhaitez obtenir la dernière ligne de la table sans identifiant unique ou identité, vous pouvez utiliser insert trigger.

+0

+1 bonne idée, c'était la première pensée qui me venait à l'esprit. –

-1
DECLARE @IDs TABLE(id int) 

insert into TableName(TableID, TableRowValue) 
output inserted.TableID into @IDs 
values(857, 'Test'); 

- L'identité insérée sera dans la variable tableau @IDs

+0

Si c'était le contexte de la question, vous n'auriez même pas besoin de la table de sortie, voulez-vous – RichardTheKiwi

0

si vous insérez quelque chose par la procédure stockée, vous devez utiliser SELECT SCOPE_IDENTITY() qui retourne la dernière valeur d'identité créée dans la session en cours, mais cela le limitera également à votre portée actuelle. Par cette utilisation, vous n'obtiendrez pas la dernière identité insérée qui peut être causée par le déclencheur. N'oubliez pas cela si vous utiliserez le résultat pour l'opération d'insertion à l'intérieur d'une procédure identique ou appelée.

Questions connexes