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 :

comment connaitre l'ID dans un insert ?


Sujet :

MS SQL Server

  1. #1
    Membre à l'essai
    Inscrit en
    Novembre 2006
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 18
    Points : 18
    Points
    18
    Par défaut comment connaitre l'ID dans un insert ?
    Bonjour,

    voila je fais un insert mais je dois connaitre mon ID avant, une idee ?
    merci d'avance ?

  2. #2
    Membre éprouvé
    Homme Profil pro
    Touche à tout informatique autodidacte
    Inscrit en
    Janvier 2007
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Touche à tout informatique autodidacte

    Informations forums :
    Inscription : Janvier 2007
    Messages : 808
    Points : 912
    Points
    912
    Par défaut
    Je crois que c'est plus facile de faire un INSERT et de récupérer l'ID après, que de faire un SELECT du dernier enregistrement et ensuite un INSERT.

  3. #3
    Fox
    Fox est déconnecté
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2002
    Messages : 52
    Points : 52
    Points
    52
    Par défaut
    Citation Envoyé par loric92
    Bonjour,
    voila je fais un insert mais je dois connaitre mon ID avant, une idee ?
    merci d'avance ?
    Comme cela est dit, il est plus logique de faire l'INSERT et de récupérer l'ID créé avec "SELECT @@identity" par exemple (je ne sais plus s'il faut un @ ou 2, à vérifier).
    Sinon, si tu n'as pas le choix, il ne reste qu'à faire un "SELECT max(champID)+1" pour l'obtenir. Attention, ceci est valable pour une utilisation solo de la BDD, si plusieurs personnes travaillent dessus en même temps, il y a un léger risque pour que l'ID retourné ne soit pas correct.

  4. #4
    Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2011
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2011
    Messages : 50
    Points : 42
    Points
    42
    Par défaut
    Bonjour, je veux faire pareil... Connaitre l'id du tuple que je viens de créer.

    Le problème c'est que je n'utilise pas une base de données solo... Donc si je fais un MAX et qu'entre temps qqn crée en meme temps un autre tuple , tout va etre décalé...

    C'est une affaire de micro secondes (je suppose) , donc je sais pas si il y a un réel risque ou non ?

    Ou est-ce qu'il existe un moyen de trouver l'id de l'insert qu'on vient de créer ?

    Merci.

  5. #5
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    SCOPE_IDENTITY est votre ami messieurs... à utiliser juste après l'INSERT...

  6. #6
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    C'est une affaire de micro secondes (je suppose) , donc je sais pas si il y a un réel risque ou non ?

    C'est plus que certains

    Le MAX+1 est une aberration malheureusement plus répandu qu'on ne le crois...

    Qui vous dis que votre auto-incrément (IDENTITY() sur la colonne...) est de 1??? (si IDENTITY il y à...)

  7. #7
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    voila je fais un insert mais je dois connaitre mon ID avant, une idee ?
    Pourquoi?

  8. #8
    Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2011
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2011
    Messages : 50
    Points : 42
    Points
    42
    Par défaut
    Citation Envoyé par iberserk Voir le message
    C'est plus que certains

    Le MAX+1 est une aberration malheureusement plus répandu qu'on ne le crois...

    Qui vous dis que votre auto-incrément (IDENTITY() sur la colonne...) est de 1??? (si IDENTITY il y à...)
    Je pensais le faire après le insert , donc j'aurai pas du faire le +1... Mais bon +1 ou pas je sentais que c'était pas la meilleure solution

    Enfin bon je vais tester tout de suite le SCOPE_IDENTITY :p

    Un grand merci !

  9. #9
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    Pour compléter :

    Il faut bien faire la distinction entre le dernier ID inséré dans la session active et le dernier ID inséré dans la table toutes étendues comprises.

    Selon ce que vous cherchez il faudra soit utiliser SCOPE_IDENTITY soit IDENT_CURRENT.

    ++

  10. #10
    Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2011
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2011
    Messages : 50
    Points : 42
    Points
    42
    Par défaut
    j'arrive pas trop à l'utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SqlCommand cmd = new SqlCommand("INSERT INTO table_name (job,progress,Edit) VALUES (@job,@progress,@Edit) ", conn);
    Après j'ajoute mes parametres et je fais un cmd.ExecuteNonQuery();

    Le SELECT SCOPE_IDENTITY , je le place où et je le récupère comment ?

    Merci

  11. #11
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    Vous n'êtes pas loin...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SqlCommand cmd = new SqlCommand("INSERT INTO table_name (job,progress,Edit) VALUES (@job,@progress,@Edit);SELECT SCOPE_IDENTITY() ", conn);
    Vous pourriez également placer votre requête dans une procedure stockée en retournant le SCOPE_IDENTITY dans un paramètre OUTPUT par exemple.

  12. #12
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    Vous n'abusez pas (enfin...) mais disons que vous pourriez tester!

    executescalar() execute la requete dans le SqlCommand et vous retourne le premier résultat de la requete (souvent utilisé avec des requetes COUNT(*) par exemple...

    Inutile donc d'executer executenonquery() d'abord sous peine de l'ajouter deux fois...

  13. #13
    Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2011
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2011
    Messages : 50
    Points : 42
    Points
    42
    Par défaut
    Citation Envoyé par iberserk Voir le message
    Vous n'êtes pas loin...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SqlCommand cmd = new SqlCommand("INSERT INTO table_name (job,progress,Edit) VALUES (@job,@progress,@Edit);SELECT SCOPE_IDENTITY() ", conn);
    Vous pourriez également placer votre requête dans une procedure stockée en retournant le SCOPE_IDENTITY dans un paramètre OUTPUT par exemple.
    Après je recupére la valeur dans le ExecuteNonQuery ?

    je fais id = cmd.executeNonQuery();

    j'affiche la valeur récupérée, il me donne tjs la valeur 1 *-)

  14. #14
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    ExecuteNonQuery() vous retourne le nombre de ligne affectées (premier lien lors d'une recherche GOOGLE en tapant executeNonQuery...)

    Utilisez execute scalar() seul.


    Citation de MSQN:
    Exécute la requête et retourne la première colonne de la première ligne du jeu de résultats retourné par la requête. Les colonnes ou lignes supplémentaires sont ignorées.

  15. #15
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    Msdn va devenir votre meilleur ami:

    static public int AddProductCategory(string newName, string connString)
    {
    Int32 newProdID = 0;
    string sql =
    "INSERT INTO Production.ProductCategory (Name) VALUES (@Name); "
    + "SELECT CAST(scope_identity() AS int)";
    using (SqlConnection conn = new SqlConnection(connString))
    {
    SqlCommand cmd = new SqlCommand(sql, conn);
    cmd.Parameters.Add("@Name", SqlDbType.VarChar);
    cmd.Parameters["@name"].Value = newName;
    try
    {
    conn.Open();
    newProdID = (Int32)cmd.ExecuteScalar();
    }
    catch (Exception ex)
    {
    Console.WriteLine(ex.Message);
    }
    }
    return (int)newProdID;
    }

  16. #16
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 901
    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 901
    Points : 53 143
    Points
    53 143
    Billets dans le blog
    6
    Par défaut
    Attention Ibersek, ce n'est ps forcément toujours un INT32, cela peut être un DECIMAL, smallint, tynint, BIGINT !

    A +

  17. #17
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour

    Vous pourriez aussi utiliser directement la clause OUTPUT (à partir de SQL Server 2005):

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    INSERT INTO Production.ProductCategory (Name) 
    OUTPUT INSERTED.LaColonnePK
    VALUES (@Name);

  18. #18
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    Attention Ibersek, ce n'est ps forcément toujours un INT32, cela peut être un DECIMAL, smallint, tynint, BIGINT !

    A +
    C'est l'exemple du site Msdn... copié collé tel quel pour sensibiliser notre jeune ami à utiliser ce site incontournable pour tout développeur .net...

  19. #19
    Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2011
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2011
    Messages : 50
    Points : 42
    Points
    42
    Par défaut
    Citation Envoyé par iberserk Voir le message
    ExecuteNonQuery() vous retourne le nombre de ligne affectées (premier lien lors d'une recherche GOOGLE en tapant executeNonQuery...)

    Utilisez execute scalar() seul.


    Citation de MSQN:
    Yosh super Tout fonctionne !

  20. #20
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    Pensez au tag [resolu]

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2007] Comment introduire une variable dans SQL INSERT
    Par JPJOLY dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 13/11/2011, 17h54
  2. [MySQL] Comment connaitre l'id d'une insertion avant l'insertion
    Par pierrot10 dans le forum PHP & Base de données
    Réponses: 14
    Dernier message: 04/06/2009, 22h52
  3. Comment connaitre le type d'un attribut dans une table?
    Par Abdou_9002 dans le forum Bases de données
    Réponses: 1
    Dernier message: 02/03/2006, 10h07
  4. Réponses: 5
    Dernier message: 28/11/2005, 09h52
  5. Comment gérez-vous les NULL dans 1 insert ?
    Par qi130 dans le forum Bases de données
    Réponses: 4
    Dernier message: 12/02/2005, 22h01

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