Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes SQL
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 08/02/2012, 14h17   #1
Membre Expert
 
Homme Benoît
Inscription : février 2003
Messages : 1 212
Détails du profil
Informations personnelles :
Nom : Homme Benoît
Âge : 31
Localisation : Belgique

Informations forums :
Inscription : février 2003
Messages : 1 212
Points : 1 796
Points : 1 796
Par défaut Synthaxe Switch

Bonjour dans une SP je dois faire un switch mais je ne sais pas si c'est possible

Code :
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?
__________________
Je ne suis qu'un pauvre débutant alors ne frappez pas si mes idées ne sont pas bonnes
BenoitM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2012, 17h08   #2
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 674
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 674
Points : 8 741
Points : 8 741
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 :
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 :
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
@++
__________________
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 10/02/2012, 08h50   #3
Membre Expert
 
Homme Benoît
Inscription : février 2003
Messages : 1 212
Détails du profil
Informations personnelles :
Nom : Homme Benoît
Âge : 31
Localisation : Belgique

Informations forums :
Inscription : février 2003
Messages : 1 212
Points : 1 796
Points : 1 796
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?
__________________
Je ne suis qu'un pauvre débutant alors ne frappez pas si mes idées ne sont pas bonnes
BenoitM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/02/2012, 07h26   #4
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 674
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 674
Points : 8 741
Points : 8 741
Citation:
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 :
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 :
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

@++
__________________
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
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 21h07.


 
 
 
 
Partenaires

Hébergement Web