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 :

[SQL2005 EXPRESS] Champs autoincrémentés


Sujet :

MS SQL Server

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 43
    Points : 32
    Points
    32
    Par défaut [SQL2005 EXPRESS] Champs autoincrémentés
    Bonjour,

    j'ai des tables avec un identifiant autoincrémenté. Lorsque j'ajoute un enregistrement, je fais la requête suivante pour connaitre la dernière valeur du champ autoincrémenté :
    SELECT IDENT_CURRENT('[MATABLE]') AS ID ;

    De cette façon, mon programme a bien les mêmes identifiant que la base de donnée.

    Le problème est qu'apparemment, lorsque la table n'a jamais eut d'enregistrement, cette requête renvoie la valeur non pas du champs autoincrémenté, mais celle du SEED (la valeur initiale du champ autoincrémenté). Dans mon cas, le SEED est à 1.

    Déroulement :

    * La table n'a jamais eut d'enregistrement.
    * Préparation d'un ajout : SELECT IDENT_CURRENT('[MATABLE]') AS ID ;
    * La requête renvoie 1 (SEED)
    * Mon programme stock l'identifiant 1
    * Préparation d'un ajout : SELECT IDENT_CURRENT('[MATABLE]') AS ID ;
    * La requête renvoie 1 (dernière valeur du champ autoincrémenté)
    * ??? problème car la valeur 1 appartient déjà à un enregistrement.
    * Préparation d'un ajout : SELECT IDENT_CURRENT('[MATABLE]') AS ID ;
    * La requête renvoie 2 (dernière valeur du champ autoincrémenté)
    * Mon programme stock l'identifiant 2
    ...

    J'espère que vous avez compris mon problème.

    Merci.

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    124
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mars 2006
    Messages : 124
    Points : 130
    Points
    130
    Par défaut
    tu inserts en base de donnée à quel moment la ?

    si tu ne supprimes pas les enregistrements de ta table, il y a plus simple, tu peux faire un cout(*) sur ta table pour savoir où tu en es !

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 43
    Points : 32
    Points
    32
    Par défaut
    Déroulement :

    * La table n'a jamais eut d'enregistrement.
    * Préparation d'un ajout : SELECT IDENT_CURRENT('[MATABLE]') AS ID ;
    * La requête renvoie 1 (SEED)
    * Mon programme stock l'identifiant 1
    * Ajout dans la base de données
    * Préparation d'un ajout : SELECT IDENT_CURRENT('[MATABLE]') AS ID ;
    * La requête renvoie 1 (dernière valeur du champ autoincrémenté)
    * ??? problème car la valeur 1 appartient déjà à un enregistrement.

    * Préparation d'un ajout : SELECT IDENT_CURRENT('[MATABLE]') AS ID ;
    * La requête renvoie 2 (dernière valeur du champ autoincrémenté)
    * Mon programme stock l'identifiant 2
    * Ajout dans la base de données
    ...


    Le cout(*), c'est ce que je faisais actuellement si ma requête me retournait 1. Mais je viens d'avoir un cas où ça ne suffit pas :
    * Insertion d'un enregistrement (Table vierge)
    * Suppression d'un enregistrement
    * Insertion d'un enregistrement : problème.

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 810
    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 810
    Points : 52 863
    Points
    52 863
    Billets dans le blog
    5
    Par défaut
    C'est tout à fait normal. La fonction IDENT_CURRENT renvoie la position du compteur et non la dernière insertion.
    Si vous voulez la dernière insertion, il convient d'interroger soit @@IDENTITY, soit SCOPE_IDENTITY().

    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/ * * * * *

Discussions similaires

  1. [SQL] récuperer la derniére valeur d'un champ autoincrément
    Par belakhdarbts dans le forum PHP & Base de données
    Réponses: 15
    Dernier message: 26/06/2006, 13h37
  2. [SQL2005 Express] problème connexion Client
    Par L.nico dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 17/05/2006, 11h27
  3. [SQL2005 Express] Est ce suffisant pour ce projet ?
    Par portu dans le forum MS SQL Server
    Réponses: 16
    Dernier message: 12/05/2006, 11h32
  4. champ autoincrement
    Par gaucher dans le forum Requêtes
    Réponses: 4
    Dernier message: 04/05/2006, 23h43
  5. SQL insertion avec champ autoIncrement
    Par sg-40 dans le forum Requêtes et SQL.
    Réponses: 7
    Dernier message: 09/11/2005, 11h28

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