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

MS SQL Server Discussion :

Procédure stockée dans sql server 2008


Sujet :

MS SQL Server

  1. #1
    Membre du Club
    Inscrit en
    Avril 2008
    Messages
    77
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 77
    Points : 40
    Points
    40
    Par défaut Procédure stockée dans sql server 2008
    Bonjour,

    Pouvez vous me donner un exemple de création d'une procédure stockée (paramétrée) dans sql server 2008, qui reçoit comme paramètre l'age d'une personne et retourne une chaine de caractère représentant l'intervalle où se situe cet age

    ex:

    paramètre => 25

    Résultat: => '20-30'

    Merci pour votre aide

  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 : 43
    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
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Créez plutôt une fonction :

    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
    CREATE FUNCTION Fn_getTrancheAge
    	(@_age tinyint)
    	RETURNS varchar(7)
    WITH SCHEMABINDING
    AS
    BEGIN
    	RETURN CASE 
    			WHEN @_age BETWEEN 0 AND 10 THEN '0-10'
    			WHEN @_age BETWEEN 11 AND 20 THEN '11-20'
    			WHEN @_age BETWEEN 21 AND 30 THEN '21-30'
    			WHEN @_age BETWEEN 31 AND 40 THEN '31-40'
    			WHEN @_age BETWEEN 41 AND 50 THEN '41-50'
    			WHEN @_age BETWEEN 51 AND 60 THEN '51-60'
    			WHEN @_age BETWEEN 61 AND 70 THEN '61-70'
    			WHEN @_age BETWEEN 71 AND 80 THEN '71-80'
    			WHEN @_age BETWEEN 81 AND 90 THEN '81-90'
    			WHEN @_age BETWEEN 91 AND 100 THEN '91-100'
    			WHEN @_age BETWEEN 101 AND 110 THEN '101-110'
    			WHEN @_age BETWEEN 111 AND 120 THEN '111-120'
    			WHEN @_age BETWEEN 121 AND 130 THEN '121-130'
    		END
    END
    Utilisation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT dbo.Fn_getTrancheAge(25)
    @++

  3. #3
    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 : 43
    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
    Points : 12 371
    Points
    12 371
    Par défaut
    Elle était un peu brutale :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    ALTER FUNCTION Fn_getTrancheAge
    	(@_age tinyint)
    	RETURNS varchar(7)
    WITH SCHEMABINDING
    AS
    BEGIN
    	RETURN CAST((@_age - 10) / 10 * 10 + 10 AS varchar(3)) + '-' + CAST((@_age + 10) / 10 * 10 AS varchar(3))
    END
    Si vous n'avez pas encore créé la fonction qui est dans mon précédent post, remplacer le ALTER par CREATE.

    Notez au passage que vous pouvez aussi utiliser cette "formule" pour spécifier une colonne calculée ou une vue

    @++

  4. #4
    Membre du Club
    Inscrit en
    Avril 2008
    Messages
    77
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 77
    Points : 40
    Points
    40
    Par défaut
    Merci infiniment esuket pour votre réponse la plus précise.ça marche nikel

  5. #5
    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 : 43
    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
    Points : 12 371
    Points
    12 371
    Par défaut
    Avec plaisir !

    Pensez quand même à la vue ou à la colonne calculée

    @++

  6. #6
    Membre habitué
    Inscrit en
    Juin 2009
    Messages
    138
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Juin 2009
    Messages : 138
    Points : 159
    Points
    159
    Par défaut
    Bonjour,

    y'a la fonction round () qui peut être utilisée aussi.
    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    round (11, -1) -- renvoie 10
    round (18, -1) -- renvoie 20
    Tu obtiens ainsi soit la borne inférieure, soit celle supérieure (il suffit de faire un test pour savoir).

    En matière de perf, je sais pas laquelle est la mieux par rapport à celle de elsuket...

  7. #7
    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 : 43
    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
    Points : 12 371
    Points
    12 371
    Par défaut
    Essayons

    Votre fonction serait donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    CREATE FUNCTION Fn_getTrancheAge_ROUND
    	(@_age tinyint)
    	RETURNS varchar(7)
    WITH SCHEMABINDING
    AS
    BEGIN
    	RETURN CASE
    			WHEN ROUND(@_age, -1) > @_age THEN CAST(ROUND(@_age, -1) -10 AS VARCHAR(3)) + '-' + CAST(ROUND(@_age, -1) AS VARCHAR(3))
    			ELSE CAST(ROUND(@_age, -1) AS VARCHAR(3)) + '-' + CAST(ROUND(@_age, -1) + 10 AS VARCHAR(3))
    		END
    END
    Nous créons la table suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE TABLE age
    (
    	id_utilisateur INT NOT NULL IDENTITY CONSTRAINT PK_age PRIMARY KEY
    	, age TINYINT NOT NULL
    )
    GO
    Et la peuplons comme suit :

    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
    WITH
    	CTE AS
    	(
    			SELECT 1 AS age
    		UNION ALL
    			SELECT age + 1
    			FROM CTE
    			WHERE age < 32767
    	)	
    INSERT	dbo.age
    (
    	age
    )
    SELECT	age % 140
    FROM	CTE
    OPTION	(MAXRECURSION 32767)
    En l'exécutant 4 ou 5 fois de façon à avoir un cardinal à peu près normal.
    Un petit index :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CREATE INDEX IX_age__age
    ON dbo.age (age)
    Et nous activons les statistiques :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SET STATISTICS IO ON
    SET STATISTICS TIME ON
    GO
    Nous exécutons les requêtes deux fois :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT	id_utilisateur
    	, dbo.Fn_getTrancheAge(age)
    FROM	dbo.age
     
    PRINT '------------------------'
     
    SELECT	id_utilisateur
    	, dbo.Fn_getTrancheAge_ROUND(age)
    FROM	dbo.age
    GO 2
    Et nous obtenons, abrégé :

    (163835*ligne(s) affectée(s))
    Table 'age'. Nombre d'analyses 1, lectures logiques 164, ...

    SQL Server \endash Temps d'exécution*:
    , Temps UC = 1045*ms, temps écoulé = 2042*ms.
    ------------------------
    (163835*ligne(s) affectée(s))
    Table 'age'. Nombre d'analyses 1, lectures logiques 164, ...

    SQL Server \endash Temps d'exécution*:
    , Temps UC = 921*ms, temps écoulé = 1991*ms.

    ------------------------
    ...
    ------------------------
    (163835*ligne(s) affectée(s))
    Table 'age'. Nombre d'analyses 1, lectures logiques 164, ...

    SQL Server \endash Temps d'exécution*:
    , Temps UC = 998*ms, temps écoulé = 1977*ms.

    (163835*ligne(s) affectée(s))
    Table 'age'. Nombre d'analyses 1, lectures logiques 164, ...

    SQL Server \endash Temps d'exécution*:
    , Temps UC = 1014*ms, temps écoulé = 1949*ms.
    Pas de grosse différence ...

    @++

  8. #8
    Membre habitué
    Inscrit en
    Juin 2009
    Messages
    138
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Juin 2009
    Messages : 138
    Points : 159
    Points
    159
    Par défaut
    Citation Envoyé par elsuket Voir le message
    Pas de grosse différence ...
    Lol ok. Merci elsuket d'avoir pris le temps de comparer les temps d'exécution.

    Cependant, dans ta version, je ne comprend pas ce que viens faire le (@_age - 10) / 10 * 10 + 10 pour établir la borne inférieure...
    Pourquoi ne pas faire simplement (@_age / 10) * 10 ?
    D'ailleurs, c'est ce que tu as fait pour ta borne supérieure...

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 13/03/2008, 17h56
  2. Réponses: 2
    Dernier message: 20/03/2007, 17h00
  3. Réponses: 2
    Dernier message: 05/12/2005, 16h39
  4. Procédures stockées imbriquées SQL Server
    Par Mike69 dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 01/10/2003, 10h31

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