IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MS SQL Server Discussion :

@@identity dans procédure stockée


Sujet :

MS SQL Server

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 51
    Points : 49
    Points
    49
    Par défaut @@identity dans procédure stockée
    Bonsoir,
    j'ai la procédure stockée suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
     
    set ANSI_NULLS ON
    set QUOTED_IDENTIFIER ON
    GO
     
    ALTER PROCEDURE CREATEINVIT
    @email varchar(50),
    @idstatut int,
    @idcompte int
     
    AS
    BEGIN	
    	SET NOCOUNT ON;   	
    	if(select count(idcompte) from compte where email= @email) =0
    	BEGIN
    		declare @iduserExt int;
    		insert into USEREXT(email)
    		values(@email);
    		select @iduserExt = @@identity;
    		insert into temp(IDUSEREXT,IDSTATUT)
    		values(@iduserExt,@idstatut);
    	END
    END
    lorsque je fais select @iduserExt = @@identity;
    Est ce que je suis absolument certain de récupérer l'identifiant de l'insertion juste avant, ou bien il est possible qu'entre l'insertion et le select, une autre insertion se soit faite entre temps, et que du coup je ne récupère pas le bon id ? J'ai vu qu'on pouvaut aussi utiliser @@SCOPEIDENTITY, mais je ne suis pas sur d'avoir bien compris.
    Merci de vos eclaircissements :-)

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 839
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 839
    Points : 52 932
    Points
    52 932
    Billets dans le blog
    5
    Par défaut
    @@identity est propre à la session en cours. Même di des millions d'utilisateurs font des insertions simultanées dans les mêmes tables, l'@@identity que vous aurez est relatif à votre dernière insertion. Cepandant si la table visée par l'insertion première comporte un trigger d'insertion qui insère dans une autre table, alors @@identity aura la valeur du dernier autoincrément de cette autre table. C'est pourquoi certains préfère SCOPE_IDENTITY qui lui porte non seulement sur la session mais la routine en cours.

    Au passage votre procédure est très mal écrite, voici comment il faudrait l'écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    ALTER PROCEDURE CREATEINVIT
    @email varchar(50),
    @idstatut int,
    @idcompte int
     
    AS
    BEGIN	
     
       SET NOCOUNT ON;   	
     
       INSERT INTO USEREXT(email)
       SELECT @email
       FROM compte 
       WHERE email= @email;
     
       IF @@ROWCOUNT > 0
          INSERT INTO temp(IDUSEREXT,IDSTATUT)
          VALUES(@@identity, @idstatut);
     
    END
    En effet entre la première requête qui compte si l'email existe, et la seconde qui fait l'insertion, il se peut qu'un autre utilisateur ait déjà compté et fasse cette même insertion avant la votre !

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 51
    Points : 49
    Points
    49
    Par défaut
    Merci pour votre aide SQLPro, je comprends mieux à présent l'utilité de @@scopeidentity.
    Pour la procédure mal écrite, je m'en suis aperçu en revenant dessus, mais je ne suis pas revenu l'éditer sur le post car ce n'était pas l'objet de ma question
    Merci bcp en tout cas.

Discussions similaires

  1. Réponses: 9
    Dernier message: 25/08/2021, 14h52
  2. Alter table dans procédure stockée
    Par mehitabelle dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 30/11/2005, 16h14
  3. Réponses: 7
    Dernier message: 16/09/2005, 10h14
  4. procédures stockées dans procédure stockée
    Par olivc dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 30/05/2005, 16h58
  5. SQL dans Procédure stockée
    Par julure dans le forum Oracle
    Réponses: 13
    Dernier message: 02/11/2004, 16h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo