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

Développement SQL Server Discussion :

Comment récupérer les lignes insérées dans une base de données ?


Sujet :

Développement SQL Server

  1. #1
    Nouveau membre du Club Avatar de JemaCodeur
    Homme Profil pro
    Amateur
    Inscrit en
    Avril 2019
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Amateur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2019
    Messages : 60
    Points : 38
    Points
    38
    Par défaut Comment récupérer les lignes insérées dans une base de données ?
    Bonjour,

    Je voulais savoir est-ce possible de faire une suite d'insertion ou de mises à jour et de récupérer via une requête que les lignes concernées ?

    Exemple :
    J'ai ma table T :
    A B
    A1 B1
    A2 B2
    A3 B3
    A4 B4

    Si c'est les trois dernières lignes qui sont mises à jour je dois les récupérer.
    Sachant que le nombre de lignes insérées ou mises à jour peuvent variés.

    J'ai essayé avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM T ORDER BY A DESC LIMIT 3
    mais cette requête devient fausse si le nombre de lignes mises à jour change.

    Merci d'avance de votre aide.

    SQL SERVER 2008

  2. #2
    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
    Hello,

    Il faut que tu utilises la clause OUTPUT pour cela. Par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    INSERT INTO MyTable(Name, Address, PhoneNo)
    OUTPUT INSERTED.Name INTO @OutputTbl(Name)
    VALUES ('AAA', 'BBB', 'CCC');
    ++

  3. #3
    Nouveau membre du Club Avatar de JemaCodeur
    Homme Profil pro
    Amateur
    Inscrit en
    Avril 2019
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Amateur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2019
    Messages : 60
    Points : 38
    Points
    38
    Par défaut
    Bonjour mikedavem,

    Merci de votre réponse.
    J'ai testé ton code mais j'avoue que ça ne réponds pas carrément à mes attentes.

    Cependant, j'ai du le gérer en programmation DELPHI et SQL en ajoutant une autre colonne Compteur dans la table T.
    Après je fais une sélection de la dernière ligne.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT COALESCE(MAX(Compteur), 0) AS Compteur FROM T
    Je la récupère avec une variable et j'ajoute 1 après chaque ensemble d'insertion pour l'incrémentation.

    Merci de ton aide

  4. #4
    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
    Autant utiliser une colonne de type IDENTITY dans ce cas. Cela t'éviterait d'avoir à calculer le max à chaque fois.
    Tu peux même récupérer la valeur insérée dans la clause OUTPUT

    ++

  5. #5
    Nouveau membre du Club Avatar de JemaCodeur
    Homme Profil pro
    Amateur
    Inscrit en
    Avril 2019
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Amateur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2019
    Messages : 60
    Points : 38
    Points
    38
    Par défaut
    Salut mikedavem,

    Vous avez raison, je pourrez faire comme vous avez dit.
    Le compteur ici c'est un Identity de mes insertions et comme vous le savais dans une insertions on peut faire une insertion de plusieurs lignes portant chacune son Identity auto-incrémenté.

    A moins que je raconte des bêtises.


  6. #6
    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
    En plus de récupérer uniquement les dernières insertions, si tu cherches à récupérer le dernier IDENTITY inséré (si je comprends bien), tu peux utiliser SCOPE_IDENTITY() au lieu de faire un SELECT MAX

    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    DROP TABLE IF EXISTS dbo.MyTable;
     
    CREATE TABLE dbo.MyTable (
    	[id] INT IDENTITY NOT NULL PRIMARY KEY,
    	[Name] VARCHAR(50) NOT NULL, 
    	[Address] VARCHAR(100) NOT NULL, 
    	PhoneNo VARCHAR(10) NOT NULL
    );
     
    DECLARE @OutputTbl TABLE (
    	[id] INT NOT NULL,
    	[Name] VARCHAR(50) NOT NULL, 
    	[Address] VARCHAR(100) NOT NULL, 
    	PhoneNo VARCHAR(10) NOT NULL
    );
     
    INSERT INTO dbo.MyTable ([Name], [Address], [PhoneNo])
    OUTPUT INSERTED.id, INSERTED.[Name], INSERTED.[Address], INSERTED.[PhoneNo] 
    INTO @OutputTbl([id], [Name], [Address], [PhoneNo])
    VALUES ('James', 'Adresse 1', '0102030405'),
    ('David', 'Adresse 2', '0203040506'),
    ('Steven', 'Adresse 3', '0304050607');
     
    SELECT * FROM @OutputTbl;
    SELECT SCOPE_IDENTITY();
    GO
     
     
    DECLARE @OutputTbl TABLE (
    	[id] INT NOT NULL,
    	[Name] VARCHAR(50) NOT NULL, 
    	[Address] VARCHAR(100) NOT NULL, 
    	PhoneNo VARCHAR(10) NOT NULL
    );
     
    INSERT INTO dbo.MyTable ([Name], [Address], [PhoneNo])
    OUTPUT INSERTED.id, INSERTED.[Name], INSERTED.[Address], INSERTED.[PhoneNo] 
    INTO @OutputTbl([id], [Name], [Address], [PhoneNo])
    VALUES ('Toto', 'Adresse 4', '0102030405');
     
    SELECT * FROM @OutputTbl;
    SELECT SCOPE_IDENTITY();
    GO
    ++

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 31/08/2013, 08h36
  2. Réponses: 14
    Dernier message: 16/09/2011, 00h38
  3. Récupérer les lignes uniques dans une table
    Par Empty_body dans le forum Langage SQL
    Réponses: 2
    Dernier message: 08/01/2009, 19h23
  4. Comment déterminer les champs modifiés dans une base
    Par Casual dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 15/06/2007, 08h33
  5. Réponses: 4
    Dernier message: 01/10/2006, 15h37

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