Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server
MS SQL-Server Forum Microsoft SQL-Server. Avant de poster -> FAQ SQL-Server, Tutoriels SQL-Server
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 05/03/2011, 23h33   #1
Membre Expert
 
Inscription : octobre 2007
Messages : 3 937
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 3 937
Points : 1 905
Points : 1 905
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 :
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
__________________
« Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)
olibara est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/03/2011, 10h30   #2
Membre éprouvé
 
Homme Hamid MIRA
Ingénieur développement logiciels
Inscription : septembre 2003
Messages : 177
Détails du profil
Informations personnelles :
Nom : Homme Hamid MIRA
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 : 177
Points : 413
Points : 413
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 :
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+
hmira est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/03/2011, 10h34   #3
Membre Expert
 
Inscription : octobre 2007
Messages : 3 937
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 3 937
Points : 1 905
Points : 1 905
merci hmira, je vais étudier cela !
__________________
« Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)
olibara est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/03/2011, 12h29   #4
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 953
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 953
Points : 17 773
Points : 17 773
Je ne voit pas pourquoi vous faîtes une procédure alors qu'une une seule requête tout va :

Code :
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 +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/03/2011, 13h38   #5
Membre Expert
 
Inscription : octobre 2007
Messages : 3 937
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 3 937
Points : 1 905
Points : 1 905
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 :
SELECT DISTINCT COALESCE(@ChauffeurID, ChauffeurID)
En gros je suppose que c'est un peu la meme chose que
Code :
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
__________________
« Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)
olibara est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/03/2011, 14h13   #6
Membre Expert
 
Inscription : octobre 2007
Messages : 3 937
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 3 937
Points : 1 905
Points : 1 905
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
__________________
« Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)
olibara est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/03/2011, 06h48   #7
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 667
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Souquet
Âge : 30
Localisation : Thaïlande

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

Informations forums :
Inscription : janvier 2005
Messages : 4 667
Points : 8 715
Points : 8 715
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.

@++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes.
Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012
elsuket est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/03/2011, 09h24   #8
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 953
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 953
Points : 17 773
Points : 17 773
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 +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/03/2011, 09h53   #9
Membre Expert
 
Inscription : octobre 2007
Messages : 3 937
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 3 937
Points : 1 905
Points : 1 905
Merci a tous !
__________________
« Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)
olibara est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 17h33.


 
 
 
 
Partenaires

Hébergement Web