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 :

IF et SELECT sur SQLSERVER2005


Sujet :

MS SQL Server

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 66
    Par défaut IF et SELECT sur SQLSERVER2005
    Voilà ce que j'aimerais faire :

    IF ( SELECT d.correctionStatus FROM data d < 0 )
    BEGIN



    Mais la syntaxe après IF laisse à désirer ....

    Quel est la solution pour écrire correctement ceci en Transac SQL

    merci de votre aide

  2. #2
    Expert confirmé
    Homme Profil pro
    Big Data / Freelance EURL
    Inscrit en
    Mars 2003
    Messages
    2 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Big Data / Freelance EURL

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 124
    Par défaut
    Il faut utiliser CASE WHEN qui est du SQL standard.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 66
    Par défaut
    SELECT CASE d.correctionStatus FROM data d
    WHEN <0
    THEN
    ..

    ELSE
    ...

    J'obtiens encore une erreur

  4. #4
    Membre éclairé
    Inscrit en
    Avril 2005
    Messages
    644
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 644
    Par défaut
    envoie l'erreur que ca te genere.

  5. #5
    Expert confirmé
    Homme Profil pro
    Big Data / Freelance EURL
    Inscrit en
    Mars 2003
    Messages
    2 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Big Data / Freelance EURL

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 124
    Par défaut
    Il faudrait un minimum lire la doc : msdn sql server: CASE WHEN

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT 
        (CASE 
            WHEN d.correctionStatus <0 THEN 1
            ELSE 2 
        END)
    FROM data

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 66
    Par défaut
    Oui en effet, mais ça me pose toujours un problème de syntaxe

    SELECT

    (CASE
    WHEN d.correctionStatus <0
    THEN

    INSERT INTO Delta_Transac_Delete (
    CHARGE_CODE,
    AMOUNT,
    TAX_CODE,
    TAX_AMOUNT,
    TOTAL_AMOUNT,
    CORRECTION_STATUS,
    ORIGIN,
    TAX_STATUS,
    ISOLATED_INVOICE_ID,
    STATUS_DELTA
    )
    SELECT *,'DELETED' FROM DATA

    ELSE

    INSERT INTO Delta_Transac_Delete (
    TRANS_ID,
    CREDITOR_ID,
    DEBTOR_ID,
    VENDOR_ID,
    BUYER_ID,
    TRANS_DATE,
    RECORD_DATE,
    LABEL,
    CURRENCY,
    DISPATCH_CODE1,
    DISPATCH_CODE2,
    DISPATCH_CODE3,
    TRANSACTION_SET_ID,
    BR_ROLE,
    BR_TYPE,
    OFFER_CODE,
    SUBSCRIPTION_CODE,
    CHARGE_CODE,
    AMOUNT,
    TAX_CODE,
    TAX_AMOUNT,
    TOTAL_AMOUNT,
    CORRECTION_STATUS,
    ORIGIN,
    TAX_STATUS,
    ISOLATED_INVOICE_ID,
    STATUS_DELTA
    )
    SELECT *,'UPDATED' FROM deleted

    END)

    FROM DATA

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 66
    Par défaut
    Voici les erreurs que j'ai :

    Msg 156, Level 15, State 1, Line 7
    Incorrect syntax near the keyword 'INSERT'.
    Msg 156, Level 15, State 1, Line 21
    Incorrect syntax near the keyword 'ELSE'.
    Msg 102, Level 15, State 1, Line 54
    Incorrect syntax near ')'.

  8. #8
    Expert confirmé
    Homme Profil pro
    Big Data / Freelance EURL
    Inscrit en
    Mars 2003
    Messages
    2 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Big Data / Freelance EURL

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 124
    Par défaut
    Décidemment tu codes tête baissée sans regarder la doc.
    La première chose à faire aurait de présenter ce début de code, comme l'exige la charte du forum, pour ne pas qu'on confonde si ta demande est en procédurale (Transact SQL avec IF) ou ensembliste (SQL avec CASE WHEN) . Là tu mélanges les 2 syntaxes.

    En plus avec ta façon de faire tu n'es pas au bout de tes peines puisque je vois le mot clé deleted qui est caractéristique des triggers.

    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    IF EXISTS (SELECT * FROM DATE WHERE d.correctionStatus <0 )
       INSERT INTO Delta_Transac_Delete 
       (
       CHARGE_CODE,
       AMOUNT,
       TAX_CODE,
       TAX_AMOUNT,
       TOTAL_AMOUNT,
       CORRECTION_STATUS,
       ORIGIN,
       TAX_STATUS,
       ISOLATED_INVOICE_ID,
       STATUS_DELTA
       )
       SELECT -- on ne mets jamais d'étoile, si la table est modifiée ça devient inmaintenable
       CHARGE_CODE,
       AMOUNT,
       TAX_CODE,
       TAX_AMOUNT,
       TOTAL_AMOUNT,
       CORRECTION_STATUS,
       ORIGIN,
       TAX_STATUS,
       ISOLATED_INVOICE_ID,
       STATUS_DELTA
      'DELETED' FROM DATA
     
    ELSE
     
       INSERT INTO Delta_Transac_Delete (
       TRANS_ID,
       CREDITOR_ID,
       DEBTOR_ID,
       VENDOR_ID,
       BUYER_ID,
       TRANS_DATE,
       RECORD_DATE,
       LABEL,
       CURRENCY,
       DISPATCH_CODE1,
       DISPATCH_CODE2,
       DISPATCH_CODE3,
       TRANSACTION_SET_ID,
       BR_ROLE,
       BR_TYPE,
       OFFER_CODE,
       SUBSCRIPTION_CODE,
       CHARGE_CODE,
       AMOUNT,
       TAX_CODE,
       TAX_AMOUNT,
       TOTAL_AMOUNT,
       CORRECTION_STATUS,
       ORIGIN,
       TAX_STATUS,
       ISOLATED_INVOICE_ID,
       STATUS_DELTA
       )
    SELECT  
      TRANS_ID,
       CREDITOR_ID,
       DEBTOR_ID,
       VENDOR_ID,
       BUYER_ID,
       TRANS_DATE,
       RECORD_DATE,
       LABEL,
       CURRENCY,
       DISPATCH_CODE1,
       DISPATCH_CODE2,
       DISPATCH_CODE3,
       TRANSACTION_SET_ID,
       BR_ROLE,
       BR_TYPE,
       OFFER_CODE,
       SUBSCRIPTION_CODE,
       CHARGE_CODE,
       AMOUNT,
       TAX_CODE,
       TAX_AMOUNT,
       TOTAL_AMOUNT,
       CORRECTION_STATUS,
       ORIGIN,
       TAX_STATUS,
       ISOLATED_INVOICE_ID,
    'UPDATED' FROM deleted

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 66
    Par défaut
    ------->OUI c'est dans un trigger ! le voici d'ailleurs :

    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
     
    CREATE TRIGGER trg_U_transac 
    ON Transac
    FOR UPDATE
    AS
    IF EXISTS (SELECT * FROM DELETED WHERE d.correctionStatus <0 )
       INSERT INTO Delta_Transac_Delete 
       (
       CHARGE_CODE,
       AMOUNT,
       TAX_CODE,
       TAX_AMOUNT,
       TOTAL_AMOUNT,
       CORRECTION_STATUS,
       ORIGIN,
       TAX_STATUS,
       ISOLATED_INVOICE_ID,
       STATUS_DELTA
       )
       SELECT -- on ne mets jamais d'étoile, si la table est modifiée ça devient inmaintenable
       CHARGE_CODE,
       AMOUNT,
       TAX_CODE,
       TAX_AMOUNT,
       TOTAL_AMOUNT,
       CORRECTION_STATUS,
       ORIGIN,
       TAX_STATUS,
       ISOLATED_INVOICE_ID,
       STATUS_DELTA
       'DELETED' FROM DELETED
     
    ELSE
     
       INSERT INTO Delta_Transac_Delete (
       TRANS_ID,
       CREDITOR_ID,
       DEBTOR_ID,
       VENDOR_ID,
       BUYER_ID,
       TRANS_DATE,
       RECORD_DATE,
       LABEL,
       CURRENCY,
       DISPATCH_CODE1,
       DISPATCH_CODE2,
       DISPATCH_CODE3,
       TRANSACTION_SET_ID,
       BR_ROLE,
       BR_TYPE,
       OFFER_CODE,
       SUBSCRIPTION_CODE,
       CHARGE_CODE,
       AMOUNT,
       TAX_CODE,
       TAX_AMOUNT,
       TOTAL_AMOUNT,
       CORRECTION_STATUS,
       ORIGIN,
       TAX_STATUS,
       ISOLATED_INVOICE_ID,
       STATUS_DELTA
       )
    SELECT  
      TRANS_ID,
       CREDITOR_ID,
       DEBTOR_ID,
       VENDOR_ID,
       BUYER_ID,
       TRANS_DATE,
       RECORD_DATE,
       LABEL,
       CURRENCY,
       DISPATCH_CODE1,
       DISPATCH_CODE2,
       DISPATCH_CODE3,
       TRANSACTION_SET_ID,
       BR_ROLE,
       BR_TYPE,
       OFFER_CODE,
       SUBSCRIPTION_CODE,
       CHARGE_CODE,
       AMOUNT,
       TAX_CODE,
       TAX_AMOUNT,
       TOTAL_AMOUNT,
       CORRECTION_STATUS,
       ORIGIN,
       TAX_STATUS,
       ISOLATED_INVOICE_ID,
       'UPDATED' FROM DELETED
    et là je me demande si le "SELECT * FROM DELETED " est judicieux parce que je n'utilise que la dernière ligne supprimée ?

  10. #10
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 999
    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 999
    Billets dans le blog
    6
    Par défaut
    Voila une version correcte de votre trigger :

    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    CREATE TRIGGER trg_U_transac 
    ON Transac
    FOR UPDATE
    AS
     
       INSERT INTO Delta_Transac_Delete 
       (
       CHARGE_CODE,
       AMOUNT,
       TAX_CODE,
       TAX_AMOUNT,
       TOTAL_AMOUNT,
       CORRECTION_STATUS,
       ORIGIN,
       TAX_STATUS,
       ISOLATED_INVOICE_ID,
       STATUS_DELTA
       )
       SELECT -- on ne mets jamais d'étoile, si la table est modifiée ça devient inmaintenable
       CHARGE_CODE,
       AMOUNT,
       TAX_CODE,
       TAX_AMOUNT,
       TOTAL_AMOUNT,
       CORRECTION_STATUS,
       ORIGIN,
       TAX_STATUS,
       ISOLATED_INVOICE_ID,
       STATUS_DELTA
       'DELETED' 
    FROM DELETED
    WHERE d.correctionStatus < 0
     
     
       INSERT INTO Delta_Transac_Delete (
       TRANS_ID,
       CREDITOR_ID,
       DEBTOR_ID,
       VENDOR_ID,
       BUYER_ID,
       TRANS_DATE,
       RECORD_DATE,
       LABEL,
       CURRENCY,
       DISPATCH_CODE1,
       DISPATCH_CODE2,
       DISPATCH_CODE3,
       TRANSACTION_SET_ID,
       BR_ROLE,
       BR_TYPE,
       OFFER_CODE,
       SUBSCRIPTION_CODE,
       CHARGE_CODE,
       AMOUNT,
       TAX_CODE,
       TAX_AMOUNT,
       TOTAL_AMOUNT,
       CORRECTION_STATUS,
       ORIGIN,
       TAX_STATUS,
       ISOLATED_INVOICE_ID,
       STATUS_DELTA
       )
    SELECT  
      TRANS_ID,
       CREDITOR_ID,
       DEBTOR_ID,
       VENDOR_ID,
       BUYER_ID,
       TRANS_DATE,
       RECORD_DATE,
       LABEL,
       CURRENCY,
       DISPATCH_CODE1,
       DISPATCH_CODE2,
       DISPATCH_CODE3,
       TRANSACTION_SET_ID,
       BR_ROLE,
       BR_TYPE,
       OFFER_CODE,
       SUBSCRIPTION_CODE,
       CHARGE_CODE,
       AMOUNT,
       TAX_CODE,
       TAX_AMOUNT,
       TOTAL_AMOUNT,
       CORRECTION_STATUS,
       ORIGIN,
       TAX_STATUS,
       ISOLATED_INVOICE_ID,
       'UPDATED' FROM DELETED
    WHERE correctionStatus >=0 OR correctionStatus  IS NULL

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

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 66
    Par défaut
    Merci à tous pour votre aide !
    Je suis en fait un dev pas un DBA donc parfois je pose sans doute des questions qui semblent idiotes.

    A ce sujet, pour le comportement de la table virtuelle DELETED : je suppose qu'elle ne contient que la dernière ligne supprimée ?

  12. #12
    Expert confirmé
    Homme Profil pro
    Big Data / Freelance EURL
    Inscrit en
    Mars 2003
    Messages
    2 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Big Data / Freelance EURL

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 124
    Par défaut
    Citation Envoyé par XAMLdev Voir le message
    Je suis en fait un dev pas un DBA donc parfois je pose sans doute des questions qui semblent idiotes.
    Certes mais les questions que tu as posé sont des questions de développement et non d'administration.

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

Discussions similaires

  1. Recupération des selections sur une DBGrille multi Selection
    Par Andry dans le forum Bases de données
    Réponses: 1
    Dernier message: 26/11/2004, 11h43
  2. [SELECT sur 16 millions de lignes] délai très grand
    Par localhost dans le forum Requêtes
    Réponses: 6
    Dernier message: 22/11/2004, 17h04
  3. insert-select sur 2 base différente
    Par gskoala dans le forum Paradox
    Réponses: 2
    Dernier message: 16/11/2004, 15h11
  4. select sur un champ de type LONG
    Par ppd dans le forum Langage SQL
    Réponses: 2
    Dernier message: 03/09/2004, 18h19
  5. select sur plusieurs table, question sur jointure
    Par Schulman dans le forum Langage SQL
    Réponses: 7
    Dernier message: 03/09/2004, 13h54

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