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 :

Synthaxe Switch [Débutant(e)]


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 197
    Par défaut Synthaxe Switch
    Bonjour dans une SP je dois faire un switch mais je ne sais pas si c'est possible

    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
     
    CREATE PROCEDURE Test
    (
        @NiveauDemande  int
    )
    AS
    BEGIN
        SET NOCOUNT ON;
        SELECT CASE (@NiveauDemande)
    		WHEN 509 THEN
                                       SELECT * FROM Table1
                              WHEN 510 THEN
                                       SELECT * FROM Table2
         END
    END
    A premiere vue Il aime pas mon Select dans le case

    Vu que mes connaissances en SQL sont limitées j'aurai voulu savoir si je faisais mal un truc ou si simplement ca n'existait pas et que je dois passer par un IF ELSE IF?

  2. #2
    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,

    En fait CASE est un opérateur, donc il ne peut être utilisé qu'entre un SELECT et un FROM dans le cas d'un SELECT.

    Ce que vous cherchez à faire peut se traiter avec un IF :

    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
    CREATE PROCEDURE Test
    (
        @NiveauDemande  int
    )
    AS
    BEGIN
    	SET NOCOUNT ON
     
    	IF @NiveauDemande = 509
    	BEGIN
    		SELECT * FROM Table1
    	END
     
    	IF NiveauDemande = 510
    	BEGIN
    		SELECT * FROM Table2
    	END
    END
    Ou bien en SQL dynamique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    ALTER PROCEDURE test
    AS
    BEGIN
    	SET NOCOUNT ON
     
    	DECLARE @sql nvarchar(1024) = 'SELECT * FROM dbo.'
     
    	SELECT	@sql = @sql + CASE @NiveauDemande
    			WHEN 509 THEN 'Table1'
    			WHEN 510 THEN 'Table2'
    		END
     
    	EXEC sp_executesql @sql
    END
    @++

  3. #3
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 197
    Par défaut
    Oki il n'existe pas de switch comme en c,c#,java ect :p

    Merci à toi


    ps: normalement on ne déconseille pas de faire du sql dynamique car les requetes ne peuvent pas être optimiser?

  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
    Oki il n'existe pas de switch comme en c,c#,java ect :p
    C'est exact puisque SQL n'est pas un langage fonctionnel : c'est un langage déclaratif, donc je dirai que le but du switch, tel que vous le montrez, en SQL n'existe pas.

    Quelle que soit la requête, SQL Server calcule le meilleur plan possible préalablement à son exécution, et en se basant sur les statistiques, ce qui suppose qu'elle sont à jour (c'est-à-dire maintenues )

    En revanche exécuter du code SQL dynamique à l'aide de EXEC (@sql) et sans paramétrer la requête créée un plan de requête pour chaque requête dès lors que les valeurs codées en dur et qui pourraient être paramétrées changent.

    En fait SQL Server, lorsqu'on lui soumet une requête, cherche dans le cache de plans la requête sur le HASH du texte de celle-ci.
    S'il ne ne trouve pas, il calcule un nouveau plan d'exécution, et le stocke dans le cache.
    Si ce phénomène se produit souvent, on observe un nombre de compilations important.

    Si on ajoute un espace, une tabulation, on point-virgule, on qu'on change les valeurs codées en dur, un nouveau plan est généré.
    Donc en écrivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT	*
    FROM	dbo.maTable
    WHERE	maColonne = '1234'
    Le plan de cette requête est mis en cache, optimisé, mais a peu de chances d'être ré-utilisé, il suffit de changer 1234 par n'importe quelle autre valeur.

    Alors que dans ce cas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT	*
    FROM	dbo.maTable
    WHERE	maColonne = @maValeur
    Comme le hash de la requête ne change pas à chaque changement de valeur de la variable @maValeur, le même plan est utilisé, donc pas de compilation

    Votre cas est un peu plus particulier parce que vous interrogez une table différente suivant la valeur d'une variable ...
    Cela laisse à penser que votre modèle de données n'a pas été conçu suivant les règles de base ... et de l'art

    @++

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

Discussions similaires

  1. SP : Synthaxe CASE (switch)
    Par BenoitM dans le forum Développement
    Réponses: 3
    Dernier message: 17/07/2009, 11h51
  2. Réseaux : switch, routeur et wi-fi
    Par SteelBox dans le forum Hardware
    Réponses: 4
    Dernier message: 07/12/2003, 20h25
  3. Switch 1000Mbit
    Par Civodul4 dans le forum Hardware
    Réponses: 8
    Dernier message: 02/12/2003, 13h16
  4. switch
    Par drKzs dans le forum C
    Réponses: 3
    Dernier message: 07/10/2003, 07h59
  5. Réponses: 6
    Dernier message: 26/01/2003, 13h45

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