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 :

Qu'est-ce qui cloche avec ce code?


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Analyse système
    Inscrit en
    Mai 2017
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Mai 2017
    Messages : 1
    Par défaut Qu'est-ce qui cloche avec ce code?
    Bonjour,

    D'abord, j'aimerais préciser que je ne suis pas un expert SQL et que je commence seulement à programmer des fonctions et procédures. Donc j'implore votre tolérance.

    J'essaie de créer cette fonction, mais SQL server m'indique qu'il y a une erreur près de "SET" à la ligne 69 qui se trouve à être le dernier "SET @Result..." avant de retourner le résultat.
    J'ai eu beau réviser mon code pour voir si j'avais loupé quelque chose, je ne vois pas où est l'os.
    Merci de m'aider svp!

    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
     
    create function cas_GetInspectorAlarmStatus 
    (
    	@UM varchar(240), 
    	@DWORDVAL numeric(38,0),
    	@ALARM1 numeric(3,0), 
    	@ALARM2 numeric(3,0), 
    	@ALARM3 numeric(3,0), 
    	@ALARM4 numeric(3,0), 
    	@ALARM5 numeric(3,0)
    )
    returns varchar(10)
    as
    BEGIN
    	DECLARE @Status numeric(3,0);
    	DECLARE @Result varchar(10);
    	DECLARE @Alarms table (idx numeric(3,0), alarm numeric(3,0));
    	insert into @Alarms select 1, @ALARM1 union select 2, @ALARM2 union select 3, @ALARM3 union select 4, @ALARM4 union select 5, @ALARM5;
     
    	IF ((@UM = 'Sélection unique') or (@UM ='Single Selection'))
    		SET @Status = 
    			CASE
    				WHEN @DWORDVAL=1  then @ALARM1
    				WHEN @DWORDVAL=2  then @ALARM2
    				WHEN @DWORDVAL=4  then @ALARM3
    				WHEN @DWORDVAL=8  then @ALARM4
    				WHEN @DWORDVAL=12 then @ALARM5
    			END;
    	ELSE
    		IF ((@UM = 'Sélections multiples') or (@UM = 'Multiple Selections'))
    			SET @Status =
    				CASE 
    					WHEN @DWORDVAL = 1  then @ALARM1
    					WHEN @DWORDVAL = 2  then @ALARM2
    					WHEN @DWORDVAL = 4  then @ALARM3
    					WHEN @DWORDVAL = 8  then @ALARM4
    					WHEN @DWORDVAL = 16 then @ALARM5
    					WHEN @DWORDVAL = 1	then (select max(alarm) from @Alarms where idx in (1))
    					WHEN @DWORDVAL = 2  then (select max(alarm) from @Alarms where idx in (2))
    					WHEN @DWORDVAL = 3  then (select max(alarm) from @Alarms where idx in (1,2))
    					WHEN @DWORDVAL = 4  then (select max(alarm) from @Alarms where idx in (3))
    					WHEN @DWORDVAL = 4  then (select max(alarm) from @Alarms where idx in (3))
    					WHEN @DWORDVAL = 6  then (select max(alarm) from @Alarms where idx in (2,3))
    					WHEN @DWORDVAL = 7  then (select max(alarm) from @Alarms where idx in (1,2,3))
    					WHEN @DWORDVAL = 8  then (select max(alarm) from @Alarms where idx in (4))
    					WHEN @DWORDVAL = 10 then (select max(alarm) from @Alarms where idx in (2,4))
    					WHEN @DWORDVAL = 11 then (select max(alarm) from @Alarms where idx in (1,2,4))
    					WHEN @DWORDVAL = 12 then (select max(alarm) from @Alarms where idx in (3,4))
    					WHEN @DWORDVAL = 13 then (select max(alarm) from @Alarms where idx in (1,3,4))
    					WHEN @DWORDVAL = 14 then (select max(alarm) from @Alarms where idx in (2,3,4))
    					WHEN @DWORDVAL = 15 then (select max(alarm) from @Alarms where idx in (1,2,3,4))
    					WHEN @DWORDVAL = 16 then (select max(alarm) from @Alarms where idx in (5))
    					WHEN @DWORDVAL = 17 then (select max(alarm) from @Alarms where idx in (1,5))
    					WHEN @DWORDVAL = 18 then (select max(alarm) from @Alarms where idx in (2,5))
    					WHEN @DWORDVAL = 19 then (select max(alarm) from @Alarms where idx in (1,2,5))
    					WHEN @DWORDVAL = 20 then (select max(alarm) from @Alarms where idx in (3,5))
    					WHEN @DWORDVAL = 21 then (select max(alarm) from @Alarms where idx in (1,3,5))
    					WHEN @DWORDVAL = 23 then (select max(alarm) from @Alarms where idx in (1,2,3,5))
    					WHEN @DWORDVAL = 22 then (select max(alarm) from @Alarms where idx in (2,3,5))
    					WHEN @DWORDVAL = 24 then (select max(alarm) from @Alarms where idx in (4,5))
    					WHEN @DWORDVAL = 25 then (select max(alarm) from @Alarms where idx in (1,4,5))
    					WHEN @DWORDVAL = 26 then (select max(alarm) from @Alarms where idx in (2,4,5))
    					WHEN @DWORDVAL = 27 then (select max(alarm) from @Alarms where idx in (1,2,4,5))
    					WHEN @DWORDVAL = 28 then (select max(alarm) from @Alarms where idx in (3,4,5))
    					WHEN @DWORDVAL = 29 then (select max(alarm) from @Alarms where idx in (1,3,4,5))
    					WHEN @DWORDVAL = 30 then (select max(alarm) from @Alarms where idx in (2,3,4,5))
    					WHEN @DWORDVAL = 31 then (select max(alarm) from @Alarms where idx in (1,2,3,4,5))
    				END;
    	END;
     
    	SET @Result = 
    		CASE 
    			when @Status = 1 then 'OK'
    			when @Status = 2 then 'OK'
    			when @Status = 3 then 'ALERT'
    			when @Status = 4 then 'DANGER'
    		END;
     
    	RETURN @Result;
    END;

  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
    Par défaut
    Bonjour,

    Vous avez un END en trop.

    D'ailleurs, vu que que votre code dans le IF...ELSE est sur plusieurs lignes, je vous recommande d'utiliser des délimiteurs pour une meilleure lisibilité :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    IF (...)
    BEGIN
       --code 
    END
    ELSE
    BEGIN
       --code 
    END

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 010
    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 : 22 010
    Billets dans le blog
    6
    Par défaut
    Le END avant le CASE termine votre fonction. Supprimez le et tout va bien !

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

  4. #4
    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 : 44
    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
    Par défaut
    Bonjour,

    Vous avez mis un END pour le deuxième IF, sans BEGIN

    Par ailleurs une autre coquille s'est glissé dans le code :
    • On a deux WHEN 1, WHEN 2, WHEN 8, WHEN 16
    • On a trois WHEN 4 : on a deux fois WHEN 4 THEN (SELECT MAX(alarm) FROM Alarms WHERE idx IN (3)), donc il n'en reste en fait que deux


    Or dès que l'un des WHEN est vérifié, les autres ne sont pas évalués.
    Donc pour ces valeurs de @DWORDVAL, on n'atteindra jamais ceux qui ont des doublons et un SELECT MAX().

    @++

  5. #5
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    Sinon, c'est quoi l'intérêt d'utiliser des numeric(3,0) ?

    Pourquoi ne pas utiliser tinyint (si les valeurs sont inférieures à 256) ou smallint ?

    Ce sera bien plus performant que d'utiliser le type numeric... (mais bon, on parle de quelques cycles CPU, c'est juste que ça me pique les yeux)

    Autant pour un numeric(3,2) je pige parfaitement l'intérêt par rapport à un float, autant pour un entier, je vois pas trop

Discussions similaires

  1. Google Panda : qu'est-ce qui change avec les CMS ?
    Par Intuitiv dans le forum Référencement
    Réponses: 1
    Dernier message: 01/09/2011, 12h03
  2. Gestion d'événements, qu'est-ce qui cloche ?
    Par Plumb dans le forum Threads & Processus
    Réponses: 2
    Dernier message: 13/07/2010, 19h30
  3. qu'est-ce qui cloche dans ma requete select??
    Par a-chan dans le forum Langage SQL
    Réponses: 3
    Dernier message: 07/07/2005, 11h35
  4. qu'est-ce qui cloche dans ma requete?
    Par a-chan dans le forum Langage SQL
    Réponses: 4
    Dernier message: 20/06/2005, 09h02
  5. Réponses: 1
    Dernier message: 21/02/2005, 12h40

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