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 :

Procédures Stockées IF ELSE / BEGIN END


Sujet :

MS SQL Server

  1. #1
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut Procédures Stockées IF ELSE / BEGIN END
    Bonjour

    Je tatonne toujours a chercher les bonnes syntaxe en procédure stockée.
    En C# j'aurais déja écrit ca de maniere tres simple mais j'aimerais quand meme essayer de maitriser la syntaxe en SP

    J'ai écrit la petite procedure suivante ca compile mais je ne sais pas si ca s'execute je pense que c'est vraiment mauvais comme maniere d'ecrire

    Plusieurs questions ;
    1 Je n'ai pas du faire de bloc BEGIN END pour mon IF et mon ELSE c'est normal ?

    2 Le ELSE est un cas particulier du IF si ChauffeurID a été défini, avez vous une suggestion pour mieux integrer cette situation sans reecrire toute la methode comme je l'ai fait ?

    Merci de m'aider pour mieux comprendre cette syntaxe (vraiment mal documentée )

    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
    USE [Clark]
    GO
    /****** Object:  StoredProcedure [dbo].[sp_DoTotal]    Script Date: 03/06/2011 00:12:00 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
     
    ALTER PROCEDURE [dbo].[sp_DoTotal]
       @ChauffeurID  int,
       @TotalType  int
    AS
    set @TotalType = (SELECT 
                         CASE @TotalType
                            WHEN 0 THEN 0
                            WHEN 9 THEN 9
                            ELSE 0
                         END)
    IF @ChauffeurID IS NULL
    BEGIN
    INSERT INTO  
     [Clark].[dbo].TotalChauffeur 
     (
       ChauffeurID,
       ChauffeurName,
       Date,
       Gewicht
      )
    SELECT 
          [ChauffeurID]
          ,[ChauffeurName]
          ,MAX(Date) as Date
          ,SUM([bruto])-sum([tarra]) as Gewicht
      FROM [Clark].[dbo].[BakMove]
      where ChauffeurID in (select ChauffeurID From [BakMove] where TotalStatus=@TotalType)
      group by 
      [ChauffeurID]
      ,[ChauffeurName]
      ,CAST(Date as Date)
      END
    ELSE
      BEGIN
    INSERT INTO  
     [Clark].[dbo].TotalChauffeur 
     (
       ChauffeurID,
       ChauffeurName,
       Date,
       Gewicht
      )
    SELECT 
          [ChauffeurID]
          ,[ChauffeurName]
          ,MAX(Date) as Date
          ,SUM([bruto])-sum([tarra]) as Gewicht
      FROM [BakMove]
      where ChauffeurID in 
      (select 
        ChauffeurID 
        From [BakMove] 
        where TotalStatus=@TotalType
        AND ChauffeurID=@ChauffeurID)
      group by 
      [ChauffeurID]
      ,[ChauffeurName]
      ,CAST(Date as Date)  
      END
      return

  2. #2
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2003
    Messages : 733
    Points : 1 668
    Points
    1 668
    Billets dans le blog
    8
    Par défaut
    1 - Le BEGIN et le END pour le IF et le ELSE ne sont pas nécessaires, mais ils donnent de la clarté dans le code. Personnellement j'aurais pas pareil. Donc tu peux les garder !
    2 - Le seul moyen que je connais, sous SQL Server, et qui permet de répondre à ce genre de situation, (c.à.d, ne pas réécrire plusieurs fois la mêmes requêtes avec des variantes légères), est le sql dynamique (EXECUTE sp_sqlexecute) voir le lien ci-dessous pour plus de détails:
    http://msdn.microsoft.com/en-us/library/ms188001.aspx

    3 - Je te suggère, même si cela n'est pas obligatoire (a) de rajouter systématiquement un point virgule à la fin de chaque inscruction T-SQL. En effet cela fait partie de la norme ANSI SQL-2
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SET @TotalType = (SELECT 
                         CASE @TotalType
                            WHEN 0 THEN 0
                            WHEN 9 THEN 9
                            ELSE 0
                         END); 
    (a) Le point virgule est parfois obligatoire : avant une déclaration de CTE, ou avant certaines instructions du Services Broker, etc.

    A+

  3. #3
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    merci hmira, je vais étudier cela !

  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 865
    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 865
    Points : 53 021
    Points
    53 021
    Billets dans le blog
    6
    Par défaut
    Je ne voit pas pourquoi vous faîtes une procédure alors qu'une une seule requête tout va :

    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
    INSERT INTO Clark.dbo.TotalChauffeur 
    (ChauffeurID,
     ChauffeurName,
     Date,
     Gewicht)
    SELECT ChauffeurID
          ,ChauffeurName
          ,MAX(Date)
          ,SUM(bruto)-sum(tarra)
      FROM Clark.dbo.BakMove
      WHERE ChauffeurID IN (SELECT DISTINCT COALESCE(@ChauffeurID, ChauffeurID) 
                            FROM   BakMove 
                            WHERE  TotalStatus=CASE @TotalType
                                                  WHEN 0 THEN 0
                                                  WHEN 9 THEN 9
                                                  ELSE 0
                                               END)
      GROUP BY ChauffeurID
              ,ChauffeurName
              ,Date
    A +

  5. #5
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Merci SqlPro

    Effectivement ta requete est beaucoup plus elegante, c'est exactement ce que j'espérais et je vais l'utiliser dans ma procedure.
    (je vais aussi lire la doc pour comprendre l'usage de COALESCE

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT DISTINCT COALESCE(@ChauffeurID, ChauffeurID)
    En gros je suppose que c'est un peu la meme chose que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ISNULL(@ChauffeurID, ChauffeurID)
    N.B.:J'utilise une procedure pour decharger l'application de l'appel de la requete
    L'application etant sur un device mobile connecté en WIFI, j'essaye de minimiser les dialogues entre le serveur et le device
    Cette procedure pourrait alors elle meme etre appellée par un Trigger

  6. #6
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Bonjour SqlPro

    J'utilise souvent une petite astuce que tu n'avais pas repris dans ton exemple

    Dans le GROUP BY je fais
    Et dans le Select je fais
    Cela me permet de grouper toutes les operations d'un meme jour et de conserver la date de la derniere opération

  7. #7
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Effectivement ISNUL() et COALESCE() remplissent une fonction (sans jeu de mots) similaire, à ceci près que :

    - ISNULL() ne prend que deux paramètres
    - COALESCE() en prend autant que vous voulez (je ne connais pas la limite )

    Les deux fonctions retournent NULL si toutes les valeurs sont NULL.

    @++

  8. #8
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 865
    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 865
    Points : 53 021
    Points
    53 021
    Billets dans le blog
    6
    Par défaut
    Et COALESCE c'est la norme SQL. Vous le retrouverez donc sur tous les SGBDR alors que ISNULL (en un seul mot) est spécifique à SQL Server.

    A +

  9. #9
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Merci a tous !

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

Discussions similaires

  1. IF ELSE dans une Procédure Stockée
    Par Marc_27 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 10/10/2012, 09h47
  2. Begin.. End Erreur, procédure stockée
    Par Kaliakev dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 09/10/2010, 20h14
  3. Procédure stockée dans un IF ELSE
    Par Oberown dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 10/08/2009, 14h19
  4. Explication procédure stockée
    Par underworld dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 09/09/2002, 10h51
  5. [Comparatif] Procédures stockées, triggers, etc.
    Par MCZz dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 28/08/2002, 12h27

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