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 :

[2008] MERGE avec (max + Compteur)


Sujet :

Développement SQL Server

  1. #1
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Septembre 2003
    Messages
    399
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Septembre 2003
    Messages : 399
    Points : 259
    Points
    259
    Par défaut [2008] MERGE avec (max + Compteur)
    Bonjour,

    Dans une requête MERGE (UPSERT) j'ai besoin de calculer max+1 d'un champ de la table de destination.
    Mon problème c'est que ma requête fait le max+1 mais une fois pour tous les enregistrements
    donc je me retrouve avec la mêmes valeur partout (1, 1, 1) au lieu de (1,2,3)
    Quand c'est un simple select j'utilise ROW_NUMBER mais là ça ne passe pas.

    Exemple très simplifié et très allégé pour testé l'essentiel (en prod dans le merge j'ai bien une partie update)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Declare @T1 as table (A varchar(50),B int);
    Declare @T2 as table (A varchar(50),B int);
    INSERT INTO @T2(A,B) values('A',1);
    INSERT INTO @T2(A,B) values('B',2);
     
    MERGE @T1 AS T
    USING @T2 S
    ON  T.A = S.A
    WHEN NOT MATCHED BY TARGET 
    THEN INSERT(A,B)  VALUES( ( cast(getdate() as varchar(50))) , (ROW_NUMBER() OVER (ORDER BY (SELECT 1)) + (SELECT MAX(B) FROM @T1)) );
     
    select * from @T1
    select * from @T2

    Merci pour votre aide

  2. #2
    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 pouvez dans ce cas inclure le calcul directement dans la source, comme ceci :

    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
     
    Declare @T1 as table (A varchar(50),B int);
    Declare @T2 as table (A varchar(50),B int);
    INSERT INTO @T2(A,B) values('A',1);
    INSERT INTO @T2(A,B) values('B',2);
     
    MERGE @T1 AS T
    USING (
    	SELECT 
    			A
    		,	cast(getdate() as varchar(50)) AS X
    		,	ROW_NUMBER() OVER (ORDER BY (SELECT 1)) + COALESCE((SELECT MAX(B) FROM @T1), 0) AS Y
    	FROM  @T2 
    ) AS S
    	ON  T.A = S.A
    WHEN NOT MATCHED BY TARGET 
    THEN INSERT(A,B)  VALUES(S.X,S.Y );
     
     
    select * from @T1
    select * from @T2

  3. #3
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Septembre 2003
    Messages
    399
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Septembre 2003
    Messages : 399
    Points : 259
    Points
    259
    Par défaut
    Parfait, merci beaucoup

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

Discussions similaires

  1. soucis avec MAX(variable de type varchar)
    Par littledoudou dans le forum Langage SQL
    Réponses: 1
    Dernier message: 24/04/2006, 19h07
  2. Requete avec Max
    Par Le Pharaon dans le forum Langage SQL
    Réponses: 11
    Dernier message: 16/01/2006, 10h59
  3. Pb requete avec MAX
    Par Karibou dans le forum MS SQL Server
    Réponses: 11
    Dernier message: 18/08/2005, 14h05
  4. [Débutant] Requête SELECT avec max et sous-requête
    Par joefou dans le forum Langage SQL
    Réponses: 2
    Dernier message: 27/07/2005, 14h28
  5. Merge avec variables
    Par kluh dans le forum Oracle
    Réponses: 18
    Dernier message: 25/07/2005, 14h31

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