none
Recupération et insertion de la dernière valeure autoincrement RRS feed

  • Question

  • Bonjour tout le monde. Je reformule ma question, peut être que je ne me suis pas fait bien exprimer, car il n'y a aucune réaction. Je veux automatiser une opération dans ma base de données qui est en SQL server. J’ai deux tables: la table mère: Commande et la table fille: Detail_commande. la table Commande a pour champs: idcom int identity en clé primaire, datecom. La table Detail_commande: idlignecom int identity en clé primaire et idcom int en clé étrangère référençant la table commande. Mon souci c'est d'avoir une procédure stockée ou une fonction qui récupère la dernière valeur identity sur la table Commande et l'insère automatiquement, pour chaque ligne de la table Detail_commande, dans la colonne "idcom" de la table Detail_commande. Merci pour votre aide.
    mercredi 19 août 2015 10:49

Réponses

  • Le plus propre est de réaliser quand tu réalises une insertion dans la table Commande de récupérer dans la même session la valeur idcom via : SELECT @@IDENTITY.

    Pour plus d'information sur : @@IDENTITY

    Le plus simple est de passer par un trigger et tu récupères la valeur inséré via la table : INSERTED

    .

    mercredi 19 août 2015 12:35

Toutes les réponses

  • Le plus propre est de réaliser quand tu réalises une insertion dans la table Commande de récupérer dans la même session la valeur idcom via : SELECT @@IDENTITY.

    Pour plus d'information sur : @@IDENTITY

    Le plus simple est de passer par un trigger et tu récupères la valeur inséré via la table : INSERTED

    .

    mercredi 19 août 2015 12:35
  • Est ce que la réponse vous a permis de résoudre votre problème ?
    jeudi 20 août 2015 13:17
  • Bonjour

    La problématique est elle toujours d’actualité ? la solution proposée est elle suffisante ? Si oui, merci de marquer la sujet comme résolu afin que d'autres personnes puisse en profiter.

    jeudi 27 août 2015 09:21
  • Salut Greg

    Je ne suis pas sur que le @@soit la manière la plus propre.

    Perso, je préfère vue que l'on est dans une SP travailler avec la clause output sur le premier insert qui permet de récupérer les infos insérées et donc réutiliser l'ID dans la table fille.


    Christophe LAPORTE - Independent Consultant & Trainer - SQL Server MVP-MCM

    samedi 5 septembre 2015 11:48
  • Ne pas utiliser @@IDENTITY car, bien qu'il fournisse la valeur du dernier auto incrément, il peut vous fournir une valeur inattendue du fait de la présence potentielle de déclencheurs.

    Vous devez utiliser SCOPE_IDENTITY() qui fournit la valeur du dernier auto incrément dans l'étendue de code.

    Démonstration...

    USE tempdb;
    GO
    
    CREATE TABLE T_CLIENT
    (CLI_ID       INT IDENTITY(1, 1) PRIMARY KEY,
     CLI_NOM      VARCHAR(32))
    
    CREATE TABLE T_REMISE_CLIENT
    (RMS_ID       INT IDENTITY(100, 1) PRIMARY KEY,
     CLI_ID       INT NOT NULL FOREIGN KEY REFERENCES T_CLIENT (CLI_ID),
     RMS_MONTANT  DECIMAL(5, 2) NOT NULL CHECK (RMS_MONTANT BETWEEN 0 AND 100));
    
    CREATE TABLE T_FACTURE
    (FAC_ID       INT IDENTITY PRIMARY KEY,
     CLI_ID       INT NOT NULL FOREIGN KEY REFERENCES T_CLIENT (CLI_ID),
     FAC_DATE     DATE NOT NULL DEFAULT GETDATE());
    GO
    
    CREATE TRIGGER E_I_CLI
    ON T_CLIENT
    FOR INSERT
    AS
    INSERT INTO T_REMISE_CLIENT
    SELECT CLI_ID, 5
    FROM   inserted;
    GO
    
    CREATE PROCEDURE P_CLI_FAC @CLI_NOM VARCHAR(32), 
                               @DATE_FAC DATE
    AS
    
    INSERT INTO T_CLIENT
    SELECT @CLI_NOM;
    
    INSERT INTO T_FACTURE
    SELECT @@IDENTITY, @DATE_FAC
    
    GO
    
    EXEC P_CLI_FAC 'toto', '2015-09-15'
    
    Message d'erreur :

    L'instruction INSERT est en conflit avec la contrainte FOREIGN KEY "FK__T_FACTURE__CLI_I__25869641". Le conflit s'est produit dans la base de données "tempdb", table "dbo.T_CLIENT", column 'CLI_ID'.

    En rajoutant un PRINT @@IDENTITY, vous observerez que la valeur reçue est 100 et non 1 comme attendu, car le dernier auto incrément a eu lieu dans la table des remise

    SCOPE_IDENTITY() vous donner la bonne valeur.

    Quand à utiliser la clause OUTPUT elle n'a d'intérêt que si vous insérez pluseirus lignes dans la table d'entête, ce qui est rarement le cas, et coute beaucoup plus cher en traitement (création des pseudo tables inserted ou deleted dans la tempdb puis lecture...)

    SQL Server 2014 - Brouard, Soutou, Souquet, Barbarin - Eyrolles

    Pour en savoir plus !

    A +

     

    mercredi 23 septembre 2015 12:38