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


Sujet :

MS SQL Server

  1. #1
    Débutant
    Profil pro
    Inscrit en
    Février 2009
    Messages
    625
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 625
    Points : 219
    Points
    219
    Par défaut Procédure stockée
    Bonsoir,
    j'ai du mal à utiliser les procédures stockées.

    Dans cette exemple je dois retourner une liste de format FOR_ID et FOR_NOM
    mais dans un sqlserver j'ai un soucis...

    exemple de retour:

    carte publicitaire 5
    flyer 6

    Sur sqlserver:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    create procedure  SP_FORMAT
    (@produit int , @nom char(50) output, @id int output)
    as
    select distinct(for_nom), for_id from refpf, forma where refpf_for=for_id AND refpf_pro=@produit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    exec SP_FORMAT 3
     
    Serveur : Msg 201, Niveau  16, État 4, Procédure SP_FORMAT, Ligne 0
    La procédure 'SP_FORMAT' attend le paramètre '@nom', qui n'a pas été fourni.

    je veux juste retourner mes deux listes FOR_ID et FOR_NOM a partir d'un paramètre, mais comment faire ?

  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,

    Dans la mesure où tous les membres de ce forum participent librement, je trouve assez malvenu de commander la réécriture d'une procédure stockée pour mardi.
    Même si telle n'était pas l'intention, c'est souvent de cette façon que c'est perçu par les participants réguliers à ce forum.
    Néanmoins je vais répondre ...

    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
    CREATE PROCEDURE SP_FORMAT
    (
    	@produit INT,
    	@nom CHAR(50) = NULL OUTPUT,
    	@id INT = NULL OUTPUT
    )
    AS
    BEGIN
    	IF @produit IS NULL
    	BEGIN
    		RAISERROR('SP_FORMAT : Le paramètre @produit doit être valué !', 16, 1)
    	END
    	ELSE
    	BEGIN
    		SELECT DISTINCT(F.for_nom),
    				F.for_id
    		FROM dbo.refpf AS R
    		JOIN dbo.forma AS F ON R.refpf_for = F.for_id
    		WHERE R.refpf_pro = @produit
    	END
    END
    1. Placez vos jointures dans la clause FROM/JOIN plutôt que dans la clause WHERE, c'est la norme, c'est plus lisible, et dans certains cas plus performant

    2. qualifiez vos noms d'objet, cela évite au moteur de bases de données de devoir chercher dans les tables systèmes à quel schéma ils appartiennent, donc votre requête commencera à s'éxécuter plus tôt

    3. pour effectuer des appels de procédures avec des paramètres optionnels, il suffit de les déclarer en tant que tel, c'est à dire en ajoutant la clause "= NULL" derrière le type de chacun des paramètres qui doivent l'être. Un paramètre déclaré comme OUTPUT est d'entrée/sortie, et non pas seulement de sortie.

    @++

  3. #3
    Membre confirmé Avatar de agemis31
    Profil pro
    DBA
    Inscrit en
    Octobre 2007
    Messages
    399
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : DBA

    Informations forums :
    Inscription : Octobre 2007
    Messages : 399
    Points : 478
    Points
    478
    Par défaut
    Bonsoir,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    CREATE procedure  SP_FORMAT
    @produit int, @nom char(50) output, @id int output
    AS
    BEGIN
    SELECT TOP 1 
    @nom = for_nom, 
    @id = for_id 
    FROM refpf, forma 
    WHERE refpf_for=for_id AND refpf_pro=@produit
    END 
     
    -- Vous devez déclarer et passer les variables output
    DECLARE @nom VARCHAR(50); DECLARE @id INT
    EXEC SP_FORMAT 3, @nom OUTPUT, @id OUTPUT
    J'ai ajouté un TOP 1 car votre DISTINCT laisse à penser que vous pouvez avoir plusieurs lignes en retours. Dans ce cas, les variables en output telles que vous les avez déclarées ne fonctionneront pas, car vous ne pouvez mettre plusieurs valeurs dans un variable scalaire.
    Si c'est le cas, vous pouvez renvoyer un jeu de résultat sans passer par des variables en sortie, ou créer une fontion de table.

    En règle génerale, on évite de nommer ses procédures stockées sp_xxx car les procédures stockées étendues commencent aussi par sp_

    Enfin, demander une réécriture de requête pour mardi sur un forum tel que celui ci me semble limite. Nous avons aussi un boulot !

    Par contre, je n'avais pas lu correctement votre post, puisque vous précisez que vous devez retourner une liste :-)

    @+

  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 : 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
    Ha ben on a répondu en même temps, et approximativement la même chose à propos du "pour mardi"

    @++

  5. #5
    Membre confirmé Avatar de agemis31
    Profil pro
    DBA
    Inscrit en
    Octobre 2007
    Messages
    399
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : DBA

    Informations forums :
    Inscription : Octobre 2007
    Messages : 399
    Points : 478
    Points
    478
    Par défaut
    Oui, sauf que tu as mieux lu que moi :-)

  6. #6
    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
    Ben il se débrouillera, il a tout demain pour trouver

    @++

  7. #7
    Débutant
    Profil pro
    Inscrit en
    Février 2009
    Messages
    625
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 625
    Points : 219
    Points
    219
    Par défaut
    merci c'est gentil ! donc je ne peux pas retourner une liste avec une procédure stockée je dois faire une fonction de table c'est bien sa ?

  8. #8
    Membre confirmé Avatar de agemis31
    Profil pro
    DBA
    Inscrit en
    Octobre 2007
    Messages
    399
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : DBA

    Informations forums :
    Inscription : Octobre 2007
    Messages : 399
    Points : 478
    Points
    478
    Par défaut
    Bonsoir,

    Non, ce n'est pas ça, vous pouvez le faire avec les deux, dans votre cas, la procédure stockée est sans doute toute indiquée.

    Voici un cours utile sur TSQL
    Regardez le chapitre 4.2

    PS: On ne parle pas de liste mais de jeu de resultat

    @+

Discussions similaires

  1. passage d'un nom de table dans une procédure stockée
    Par thierry V dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 26/07/2010, 16h48
  2. Procédure stocké:Insert et renvoie de la clé primair
    Par caramel dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 17/04/2003, 09h34
  3. [Pervasive SQL ] procédure stockée
    Par magellan dans le forum Autres SGBD
    Réponses: 2
    Dernier message: 25/10/2002, 13h17
  4. Explication procédure stockée
    Par underworld dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 09/09/2002, 10h51
  5. [Comparatif] Procédures stockées, triggers, etc.
    Par MCZz dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 28/08/2002, 12h27

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