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 :

Le SELECT CASE pour attribuer une valeur à une variable


Sujet :

Développement SQL Server

  1. #1
    Membre extrêmement actif
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Points : 1 434
    Points
    1 434
    Par défaut Le SELECT CASE pour attribuer une valeur à une variable
    Bonjour à tous.

    J'ai un souci dans la rédaction d'une partie d'une Procédure Stockée
    Je dois prendre la valeur d'une variable en argument et attribuer quatre valeurs à quatre variables en fonction.
    J'ai parcouru la doc et pas mal d'exemple, mais j'ai rien trouver qui colle à ce que je dois faire parfaitement et j'arrive pas à adapter, certainement dû au fait que je ne maîtrise pas à fond le langage T-SQL.
    Voici mon code actuel qui ne marche pas du tout :
    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
     
    DECLARE @RoleHerosFR AS VARCHAR(20), @RoleHerosEN AS VARCHAR(20), @RoleHerosDE AS VARCHAR(20), @RoleHerosES AS VARCHAR(20)
    DECLARE @RoleHeros AS VARCHAR(20)
    SET @RoleHeros = 'Guerrier'
     
    SELECT
    CASE @RoleHeros 
    	WHEN 'Guerrier' THEN 
    		@RoleHerosFR = 'Guerrier', @RoleHerosEN = 'Warrior' AND @RoleHerosDE = 'Krieger' AND @RoleHerosES = 'Guerrero'
    	WHEN 'Assassin' THEN
    		@RoleHerosFR = 'Assassin', @RoleHerosEN = 'Assassin' AND @RoleHerosDE = 'Assassinen' AND @RoleHerosES = 'Asesino'
    	WHEN 'Soutien' THEN
    		@RoleHerosFR = 'Soutien', @RoleHerosEN = 'Support' AND @RoleHerosDE = 'Unterstützer' AND @RoleHerosES = 'Apoyo'
    	WHEN 'Spécialiste' THEN
    		@RoleHerosFR = 'Soutien', @RoleHerosEN = 'Specialist' AND @RoleHerosDE = 'Spezialisten' AND @RoleHerosES = 'Espacialista'
    	WHEN 'Multiclasse' THEN
    		@RoleHerosFR = 'Multiclasse', @RoleHerosEN = 'Multiclasse' AND @RoleHerosDE = 'Multiklassehelden' AND @RoleHerosES = 'Multiclase'
    END
    Pour ceux qui connaissent il s'agit des rôles de personnage de Heroes of the Storm (vous l'aurez reconnu de suite, j'en suis sûr). L'idée est de récupérer dans une variable le rôle du personnage et de charger quatre variables avec sa correspondance dans quatre langues. Je développe un outil pour afficher des informations sur les personnages et les joueurs du HGC (la compétition mondiale sur ce jeu) et comme en France l'eSport n'est pas ultra développer encore, je fais l'outil en plusieurs langues en espérant qu'il soit utiliser ailleurs.

    Bref, je n'arrive pas à trouver comment je charge mes quatre variables dans chaque THEN.
    J'ai essayé avec des ";" mais ça marche pas. J'ai essaye des "," et ça marche pas non plus.
    J'ai essayé de mettre de SET devant chaque variables, mais ça marche pas non plus.

    Je suis un peu perdu et j'apprécierais un petit coup demain.

    Merci d'avance.
    Mon blog de création d'univers : Qualhiryann
    Mon site qui parle de moi www.ozouf.com
    Pour les joueurs de WOW je suis sur Ysondres et mon perso est Ablanore.

  2. #2
    Membre chevronné
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Points : 1 806
    Points
    1 806
    Par défaut
    La structure CASE est une structure d'affectation de données, ce n'est pas un IF qui permet des instructions conditionnelles.

    Pour le faire avec des IF, une simple suite de IF ( condition1 ) THEN BEGIN (traitement1) END ELSE IF (condition2) THEN BEGIN (traitement2) END ELSE ...

    Mais le mieux dans le cas présent c'est surtout d'avoir une table de correspondance, avec une clé, une langue, et la traduction.
    Et de faire le select qui va bien en fonction de la langue et de la clé pour avoir le bon libellé. L'avantage étant qu'ajouter une langue ne demande pas de changer une ligne de code, juste d'ajouter les traductions dans la table ...

  3. #3
    Membre extrêmement actif
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Points : 1 434
    Points
    1 434
    Par défaut
    Merci pour ton aide.

    Donc avec le CASE je ne fais pas pareil qu'en VB avec un SELECT CASE (ou un SWITCH en C#) si je comprends bien ?
    Je vais peut-être déporter cette partie dans ma page Web alors et envoyer quatre arguments au lieu d'un à la Proc Stock.

    Merci aussi pour le conseil, je pense que cela en s'applique pas dans mon cas, même si j'ai fait ces que tu décris en partie. Mon souci ici est pour faire l'insertion d'un nouveau personnage qui se trouve réparti sur deux tables.
    J'ai fait comme ça :
    Une table Heros
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    CREATE TABLE [dbo].[STATH_Heros](
    	[Id_Heros] [int] IDENTITY(1,1) NOT NULL,
    	[Univers] [nvarchar](255) NULL,
    	[Date_Sortie] [datetime] NULL,
    	[Nom_Image] [varchar](50) NULL
    ) ON [PRIMARY]
    Parce que l'Univers se dit de la même manière dans toutes les langues, la date de sortie est la même pour tout le monde et l'image aussi.
    Et ensuite je fais une table comme cela :
    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
     
    CREATE TABLE [dbo].[STATH_Heros_Nom](
    	[Id_Heros_Nom] [int] IDENTITY(1,1) NOT NULL,
    	[Heros_Id] [int] NOT NULL,
    	[Nom_Perso] [varchar](20) NOT NULL,
    	[Role_Perso] [varchar](20) NOT NULL,
    	[Langue] [varchar](10) NOT NULL
    ) ON [PRIMARY]
     
    GO
     
    ALTER TABLE [dbo].[STATH_Heros_Nom] ADD  CONSTRAINT [DF_STATH_Heros_Nom_Nom_Perso]  DEFAULT ('') FOR [Nom_Perso]
    GO
     
    ALTER TABLE [dbo].[STATH_Heros_Nom] ADD  CONSTRAINT [DF_STATH_Heros_Nom_Role_Perso]  DEFAULT ('') FOR [Role_Perso]
    GO
     
    ALTER TABLE [dbo].[STATH_Heros_Nom] ADD  CONSTRAINT [DF_STATH_Heros_Nom_Langue]  DEFAULT ('') FOR [Langue]
    GO
    Et donc je mets tout ce qui change en fonction des langues. Je n'i pas fait de table spécifique pour les rôles parce qu'il n'y en que 5 et qu'il n'y a eu ajout d'un seul ajout en trois ans et je pense qu'il n'y en aura pas d'autre avant un bon bout de temps. Et puis aussi parce que ça allait m'obliger à faire une jointure de plus dans pas mal de requête et j'ai eu peur de pas m'en sortir.

    Maintenant je suis ouvert à la critique, je ne suis pas une foudre de guerre pour mettre au pont un modèle de donnée, j'avoue humblement.

    Merci pour ton aide et bonne après midi.
    Mon blog de création d'univers : Qualhiryann
    Mon site qui parle de moi www.ozouf.com
    Pour les joueurs de WOW je suis sur Ysondres et mon perso est Ablanore.

  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 770
    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 770
    Points : 52 726
    Points
    52 726
    Billets dans le blog
    5
    Par défaut
    La syntaxe est la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    DECLARE @RoleHerosFR AS VARCHAR(20), @RoleHerosEN AS VARCHAR(20), @RoleHerosDE AS VARCHAR(20), @RoleHerosES AS VARCHAR(20)
    DECLARE @RoleHeros AS VARCHAR(20)
    SET @RoleHeros = 'Guerrier'
     
    IF @RoleHeros ='Guerrier' SELECT @RoleHerosFR =  'Guerrier', @RoleHerosEN = 'Warrior' , @RoleHerosDE = 'Krieger' , @RoleHerosES = 'Guerrero'
    ELSE
       IF @RoleHeros = 'Assassin' SELECT @RoleHerosFR = 'Assassin', @RoleHerosEN = 'Assassin' , @RoleHerosDE = 'Assassinen' , @RoleHerosES = 'Asesino'
    	ELSE 
          IF @RoleHeros = 'Soutien' SELECT @RoleHerosFR = 'Soutien', @RoleHerosEN = 'Support' , @RoleHerosDE = 'Unterstützer' , @RoleHerosES = 'Apoyo'
    	   ELSE 
             IF @RoleHeros = 'Spécialiste' SELECT @RoleHerosFR = 'Soutien', @RoleHerosEN = 'Specialist' , @RoleHerosDE = 'Spezialisten' , @RoleHerosES = 'Espacialista'
    	      ELSE 
                IF @RoleHeros = 'Multiclasse' SELECT @RoleHerosFR = 'Multiclasse', @RoleHerosEN = 'Multiclasse' , @RoleHerosDE = 'Multiklassehelden' , @RoleHerosES = 'Multiclase';
    Et pour de plus amples informations :
    Nom : Couverture livre SQL server Eyrolles.jpg
Affichages : 2119
Taille : 105,0 Ko

    Je sais, c'est 1238 pages à se farcir !

    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
    Membre extrêmement actif
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Points : 1 434
    Points
    1 434
    Par défaut
    Merci beaucoup SQL Pro et bon week-end à toi.
    Mon blog de création d'univers : Qualhiryann
    Mon site qui parle de moi www.ozouf.com
    Pour les joueurs de WOW je suis sur Ysondres et mon perso est Ablanore.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 02/06/2010, 08h11
  2. attribuer à une valeur une partie d'une url
    Par thomas28 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 04/11/2007, 19h54
  3. attribuer une valeur à une variable
    Par johnvox dans le forum Windows Forms
    Réponses: 2
    Dernier message: 10/01/2007, 09h58
  4. Réponses: 8
    Dernier message: 17/08/2006, 16h16
  5. Réponses: 1
    Dernier message: 22/09/2005, 15h46

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