Recherche du premier identifiant manquant (trou) d'une table

Soyez le premier à donner votre avis sur cette source.

Snippet vu 7 681 fois - Téléchargée 29 fois

Contenu du snippet

Ce script sert à optimiser l'insertion d'enregistrements dans une base. La fonction renvoie (dans le cas present pour la table patient) le premier identifiant manquant (PK) dans la table, ainsi plus de discontinuités dans les IDs ...
Cordialement Djhal

Source / Exemple :


CREATE FUNCTION Find_Id() RETURNS INT
AS
BEGIN
DECLARE @cpt INT
DECLARE @tmp INT

DECLARE curseur CURSOR FOR 
(
	SELECT id_pat 
	FROM patient
)

OPEN curseur

FETCH NEXT FROM curseur
INTO @cpt

IF @cpt!=NULL
BEGIN
          SET @tmp=@cpt-1
END
ELSE
BEGIN
          SET @tmp=0
END

WHILE @@FETCH_STATUS=0
BEGIN	
	IF @tmp+1!=@cpt
	BEGIN
		CLOSE curseur
		DEALLOCATE curseur
		RETURN @tmp+1
	END

	SET @tmp=@cpt

	FETCH NEXT FROM curseur
	INTO @cpt
END

CLOSE curseur
DEALLOCATE curseur

RETURN @tmp+1

END

Conclusion :


Afin d'optimiser le script :
- on pourrait faire passer le nom de la table en parametres ( ds le code patient ecrit en dur)
- ordonner la selection des enregistrements

A voir également

Ajouter un commentaire Commentaires
Messages postés
1284
Date d'inscription
mardi 28 octobre 2003
Statut
Contributeur
Dernière intervention
3 juillet 2015
13
Bonjour,

Ci dessous une petite requête avec autojointure pour trouver les éléments manquants dans la suite d'id :

Select d1.DEBUT, d1.FIN
From (
Select (e1.id_pat + 1) as DEBUT,
(select (min(id_pat) - 1)
From patient as f1
Where f1.id_pat > e1.id_pat) as FIN
From patient as e1
Left Outer Join patient as e2 On e1.id_pat = e2.id_pat - 1
Where e2.id_pat is null
) d1
Where d1.FIN is not null

Et si on veut restreindre sur un intervalle :
And d1.DEBUT >= [Début id contrôle]
And d2.DEBUT < [Fin id contrôle]
Messages postés
1
Date d'inscription
vendredi 9 mars 2012
Statut
Membre
Dernière intervention
9 mars 2012

Bonjour,

Je viens d'utiliser le code de Mindiell pour identifier les trou d'ID d'une de mes tables. Le hic est que ce code ne me renvoie pas tous les codes non utilisés mais uniquement "les trous de 1". Si en effet j'ai un trou de 50 ID, ce code ne me les retourna pas! Une idée pour palier à ce problème?
Messages postés
559
Date d'inscription
jeudi 25 juillet 2002
Statut
Membre
Dernière intervention
5 septembre 2007
1
et mea culpa donc, c'était plus ironique que moqueur...

:pardon: :pardon: :pardon:
Messages postés
196
Date d'inscription
jeudi 15 juillet 2004
Statut
Membre
Dernière intervention
14 avril 2009

Exact, il s'agit de s'entre aider pas de se moquer.
Messages postés
559
Date d'inscription
jeudi 25 juillet 2002
Statut
Membre
Dernière intervention
5 septembre 2007
1
Désolé, le ton se voulait ironique et non gincant...
Cependant, on est quand même là pour apprendre et donc jouer un peu les singes savants...

Je suis là pour apprendre des autres, et apprendre aux autres...
La source postée est intéressante, mais pas réfléchie à fond je trouve. c'est une critique que j'éspère constructive étant donné que je donne une meilleure solution, non ? ^^
Afficher les 7 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.