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 qui retourne plusieurs résultats [2008R2]


Sujet :

MS SQL Server

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2015
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2015
    Messages : 16
    Points : 18
    Points
    18
    Par défaut Procédure stockée qui retourne plusieurs résultats
    Bonjour,

    je voudrais savoir si c'est possible d'écrire une procédure stockée qui retourne plusieurs résultat et que j'exploite les résultats pour les affichées dans un gridview

    en faite je suis entrain de créer une interface web en c# dans laquelle je saisie un ensemble de critères (date_debut, date_sortie, famille_produit..)
    donc lorsque je lance ma recherche je dois chercher la liste des produits qui correspond aux critères de recherche et pour chaque produit je dois calculer son quantité total dans la table entréeStock ainsi que dans la table sortieStock aussi son quantité dans le stock
    donc chaque produit aura qteEntrée, qteSortie,qteStock..

    je veux ensuite afficher la liste des produits dans un gridview

    donc je pense à écrire une procédure stockée telque
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    ALTER PROCEDURE [dbo].[ListeProduit] 
    @date_debut date,
    @date_fin date,
    @familleProduit int
     
    AS 
    DECLARE
     
    @idProduit int,
    @qteEntree float,
    @qteSortie float,
    @qteStock float
     
    declare produit_cursor cursor for
    select distinct(idProduit) from Stock
    where date_entree > @date_debut
    and date_sortie < @date_sortie
    and id_famille = @famillePrduit;
     
    open produit_cursor
     
    fetch next from produit_cursor
    into @idProduit
    while @@FETCH_STATUS = 0
     
    begin
     
    set @qteEntree = set (select ISNULL(SUM(Entree.Qte),0)from Entree  where Entree.IDProduit = @idProduit)
    set @qteSortie = set (select ISNULL(SUM(Sortie.Qte),0)from Sortie  where Sortie.IDProduit = @idProduit)
     
    set @qteStock = @qteEntree - @qteSortie;
     
    FETCH NEXT FROM produit_cursor
    into @idProduit
    end
     
    close produit_cursor
    deallocate produit_cursor
    sachant que le résultat de ma requete Select peut retourner une ou plusieurs résultat comment puis-je les récupérer pour les insérer dans un gridview

  2. #2
    Membre averti
    Avatar de taibag
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2013
    Messages
    214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Inde

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2013
    Messages : 214
    Points : 357
    Points
    357
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Quelques remarques :

    -Pourquoi utilises-tu un curseur ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    set @qteEntree = set (select ISNULL(SUM(Entree.Qte),0)from Entree  where Entree.IDProduit = @idProduit)
    set @qteSortie = set (select ISNULL(SUM(Sortie.Qte),0)from Sortie  where Sortie.IDProduit = @idProduit)
    -Pourquoi l'imbrication des set , c'est faux , utilises un seul set:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    set @qteEntree =  (select ISNULL(SUM(Entree.Qte),0)from Entree  where Entree.IDProduit = @idProduit)
    set @qteSortie =  (select ISNULL(SUM(Sortie.Qte),0)from Sortie  where Sortie.IDProduit = @idProduit)
    -Oui une procédure stockée retourne plusieurs paramètres.
    -Vous avez des variables non déclarées.
    मैं एक छात्र हूँ |

  3. #3
    Membre à l'essai
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2015
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2015
    Messages : 16
    Points : 18
    Points
    18
    Par défaut
    bonjour,

    comme j'ai mentionné précédemment vue que j'ai un ensemble de produit comme résultat dans ma requête select j'utilise un curseur pour calculer les qteEntree, qteSortie et qteStock pour chaque résultat

    pour l'imbrication des set c'est vrai c'était seulement un faute de frappe de ma part

    ma question c'est que comment je peux retourner plusieurs lignes dans ma procédure stockée, comment dois-je déclarer le type de retour et comment puis le récupérer dans mon application

  4. #4
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2008
    Messages
    698
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Octobre 2008
    Messages : 698
    Points : 586
    Points
    586
    Par défaut
    Avec un truc comme ça, sans curseur, sans procédure, juste du sql

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Select P.idproduit,Sum(E.Qte) QteEnree,sum(S.Qte) QteSortie
    from produit P
    inner join entree E on E.idproduit=P.idproduit
    inner join Sortir S on S.idproduit=P.idproduit
    Group by P.IdProduit

  5. #5
    Membre à l'essai
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2015
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2015
    Messages : 16
    Points : 18
    Points
    18
    Par défaut
    avec une tel requete si je le met seulement pour afficher seulement idProduit et QteEntree je reçois des résultats correctes et si j'ajoute la sum(S.Qte) les résultats affichés seront erroné

    Citation Envoyé par Donpi Voir le message
    Avec un truc comme ça, sans curseur, sans procédure, juste du sql

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Select P.idproduit,Sum(E.Qte) QteEnree,sum(S.Qte) QteSortie
    from produit P
    inner join entree E on E.idproduit=P.idproduit
    inner join Sortir S on S.idproduit=P.idproduit
    Group by P.IdProduit

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    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 772
    Points : 52 732
    Points
    52 732
    Billets dans le blog
    5
    Par défaut
    Une même procédure stockée peut renvoyer :
    • plusieurs valeurs scalaires par le biais des paramètres OUTPUT
    • plusieurs jeux de résultats par le biais de dataset (requêtes SELECT ou procédures)

    Lisez mon livre pour en savoir plus : http://www.amazon.fr/dp/2212135920/

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CREATE PROC P_INFO @VER VARCHAR(1024) OUTPUT,
                       @SRVNAME sysname OUTPUT  
    AS
     
    SET @VER = @@VERSION;
    SET @SRVNAME = @@SERVERNAME;
    EXEC xp_msver;
    SELECT @@SERVERNAME AS SERVER, * FROM sys.configurations;
     
    GO
    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/ * * * * *

  7. #7
    Membre à l'essai
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2015
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2015
    Messages : 16
    Points : 18
    Points
    18
    Par défaut
    merci pour tous en faite j'ai changé de stratégie et j'ai opté pour l'utilisation de vue au lieu de la procédure stockée

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

Discussions similaires

  1. Réponses: 22
    Dernier message: 21/01/2011, 22h15
  2. ADO et procédure stockée qui renvoi plusieurs select
    Par Oliv- dans le forum Développement
    Réponses: 2
    Dernier message: 23/04/2008, 14h11
  3. Réponses: 10
    Dernier message: 14/06/2007, 19h55
  4. procédure ou fonction stockée qui retourne un résultat
    Par PoichOU dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 28/05/2007, 16h03
  5. Réponses: 3
    Dernier message: 02/03/2007, 11h41

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