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 :

Equivalent ON DUPLICATE KEY UPDATE (MySQL) sous SQL SERVER?


Sujet :

Développement SQL Server

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2019
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2019
    Messages : 7
    Points : 7
    Points
    7
    Par défaut Equivalent ON DUPLICATE KEY UPDATE (MySQL) sous SQL SERVER?
    Bonjour...

    je dois effectuer la migration d'une application existante de MySQL vers SQL SERVER.. aujourd'hui la traduction d'une requête de ''synchronisation'' entre deux tables source S et destination D utilisant la clause ON DUPLICATE KEY UPDATE me pose problème. j'ai deux cas de figures pour chaque enregistrement de S
    - la clé primaire de S n'existe pas dans D : INSERTION de l'enregistrement dans D
    - la clé primaire de S existe déjà table D && et l'information dans S est plus récente (comparaison des champs last_update (datetime) ) : UPDATE de l'enregistrement correspondant dans D

    La clé primaire n'est pas auto-increment, ce que j'ai voulu faire entre autre c'est de réaliser l'insertion et en cas d'exception ''SQLIntegrityConstraintViolationException'' (si cest bien la bonne) j'exécute la requête de mise a jour de l'enregistrement correspondant.

    Mon souci c'est que l'exception récupérée semble ne pas être du type ''SQLIntegrityConstraintViolationException''
    le code et la trace que j'obtiens plus bas quand je lance la synchronisation (la version Mysql est en exploitation et sans bug)


    Code Java : 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
    public static void importTable(File filename, String tablename) {
            Connection connection = DatabaseDriver.getConnection();
            PreparedStatement preparedStatement = null;
            preparedStatement = SynchFunction.getPreparedStatement(filename, connection, tablename);
     
            try {
                if (preparedStatement != null) {
                    if (preparedStatement.executeUpdate() >= 0) {
     
                    } 
                }
            } catch (SQLException ex) {
     
                Logger.getLogger(ExportImportSynchroFilter.class.getName()).log(Level.SEVERE, null, ex);
     
     
                if (ex instanceof SQLIntegrityConstraintViolationException) {
                    BufferError.append(ex.getSQLState());
                    System.out.println(" \n \n \n ECRIRE ICI L'UPDATE DES LIGNES EXISTANTES \n " + ex.toString() +  "\n \n \n ");
                }
     
                else{
                     System.out.println(" \n \n \n C'EST PAS LE BON TYPE D'EXCEPTION \n " + ex.toString() +  "  \n \n \n ");
                     ex.printStackTrace(); 
                    System.out.println ("LE CODE D'ERREUR EST " + ex.getMessage());
                }
     
     
            } finally {
                try {
                    if (preparedStatement != null) {
                        preparedStatement.close();
                    }
                } catch (SQLException ex) {
                    Logger.getLogger(ExportImportSynchroFilter.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
            DatabaseDriver.closeConnection(connection);
        }

    C'EST PAS LE BON TYPE D'EXCEPTION
    févr. 13, 2020 5:10:47 PM full.ExportImportSynchroFilter importTable
    GRAVE: null
    com.microsoft.sqlserver.jdbc.SQLServerException: Violation de la contrainte PRIMARY KEY «*PK_interpelle_id*». Impossible d'insérer une clé en double dans l'objet «*app_test.interpelle*». Valeur de clé dupliquée*: (2020_02_10_13_06_50_263_aaa112).

    com.microsoft.sqlserver.jdbc.SQLServerException: Violation de la contrainte PRIMARY KEY «*PK_interpelle_id*». Impossible d'insérer une clé en double dans l'objet «*app_test.interpelle*». Valeur de clé dupliquée*: (2020_02_10_13_06_50_263_aaa112).
    LE CODE D'ERREUR EST Violation de la contrainte PRIMARY KEY «*PK_interpelle_id*». Impossible d'insérer une clé en double dans l'objet

    at com.microsoft.sqlserver.jdbc.SQLServerStatement.getNextResult(SQLServerStatement.java:1493)
    C'EST PAS LE BON TYPE D'EXCEPTION
    com.microsoft.sqlserver.jdbc.SQLServerException: Aucune valeur n'est définie pour le paramètre numéro 118.
    Une idée les gars?

  2. #2
    Membre du Club
    Homme Profil pro
    none
    Inscrit en
    Janvier 2020
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : none

    Informations forums :
    Inscription : Janvier 2020
    Messages : 36
    Points : 69
    Points
    69

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2019
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2019
    Messages : 7
    Points : 7
    Points
    7
    Par défaut
    Ok je check ca voir. merci

  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 761
    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 761
    Points : 52 547
    Points
    52 547
    Billets dans le blog
    5
    Par défaut
    MERGE est la commande normalisées du langage SQL pour ce genre de chose. ON DUPLICATE KEY n'existe pas en SQL c'est une merdouille de MySQmerde !

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

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2019
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2019
    Messages : 7
    Points : 7
    Points
    7
    Par défaut
    Pour la migration je teste les fonctionnalites de l'application au fur et a mesure maintenant qu'elle est connectee a une BD SQL Server et j'adapte .
    Effectivement la clause ''MERGE'' repond exactement a mes besoins jusque la. mais j'ai une autre preoccupation , j'ai plusieurs modes de synchronisation et pour l'un d'entre eux ma table

    ''Source'' comme dans

    MERGE Target USING Source

    represente les informations provenant d'un fichier csv (cree par des exportations offline); je pense bien a exporter les donnees du fichier csv vers une table temporaire (BULK INSERT) avant d'executer le MERGE , mais en exploitation j'imagine deja les violations de contrainte sur les Primary Key de la table temporaire si des synchronisations sont lancees en parallele par plusieur appareils..

    Ouvert aux suggestions

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 761
    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 761
    Points : 52 547
    Points
    52 547
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par guyzo.salas Voir le message
    ...

    represente les informations provenant d'un fichier csv (cree par des exportations offline); je pense bien a exporter les donnees du fichier csv vers une table temporaire (BULK INSERT) avant d'executer le MERGE , mais en exploitation j'imagine deja les violations de contrainte sur les Primary Key de la table temporaire si des synchronisations sont lancees en parallele par plusieur appareils..

    Ouvert aux suggestions
    Tout dépend de la clef.... Il faut une table intermédiaire dite de "stagging", en français "servant de tampon".

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

  7. #7
    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 aussi effectuer le merge en prenant comme source directement le CSV, avec un OPENROWSET BULK...

Discussions similaires

  1. Equivalent de rownum sous SQL server
    Par Isildur dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 27/07/2009, 15h48
  2. Equivalent a REPLACE et ON DUPLICATE KEY de MySQL
    Par Anthony.Desvernois dans le forum MS SQL Server
    Réponses: 20
    Dernier message: 27/07/2007, 16h02
  3. Equivalent des table Enum de mysql sous Sql server
    Par scaleo dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 24/04/2006, 12h17
  4. syntaxe d'un update sous SQL SERVER
    Par wello00 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 08/12/2004, 14h13
  5. UPDATE multi-tables sous SQL Server
    Par Cybernet dans le forum Langage SQL
    Réponses: 8
    Dernier message: 25/03/2004, 15h34

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