Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server
MS SQL-Server Forum Microsoft SQL-Server. Avant de poster -> FAQ SQL-Server, Tutoriels SQL-Server
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 26/04/2011, 13h08   #1
Invité de passage
 
Homme
Inscription : mars 2011
Messages : 35
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : mars 2011
Messages : 35
Points : 0
Points : 0
Par défaut Imbriquer deux procédures stockées

Bonjour a tous,

Je viens de passer sur une base de donnée SQL Server et j'avoue avoir un peu de mal meme si jcommence a mi habituer.

Je souhaiterai savoir appeller une procedure stockée dans une autre procedure stockée.

Ma proc1 est censer me retour les informations sur un article par exemple un meuble ( Ce qui marche tres bien)

mais comme ce meuble existe en plusieurs couleurs ( rouge, bleu, noir, marron ) je voudrais avoir une proc2 qui va recupere toute les couleurs disponible pour une article

Comme sa je voudrais que lorsque j'appelle ma proc1, elle appelle ma proc2 pour avoir :

numero article A000
description : blabla
hauteur: 150cm
couleur ; rouge, bleu, noir, marron
.....


Je pense que c'est possible mais je ne sais pas vraiment comment j'ai bien essayé en ajoutant un exec proc2 @numart
mais le resultat obtenue n'est pas celui voulu


En esperant une reponse

bonne journée
Alegreg est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/04/2011, 10h21   #2
Invité régulier
 
Inscription : janvier 2008
Messages : 11
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 11
Points : 8
Points : 8
Salut,

Pour appeler une procédure stocké en SQL, tu peux utiliser "exec [nom_procedure]".

Comme ceci :

code...
..
..

exec tutu

Si tu as des paramètres à fournir à ta procédure stocké, tu peux les passer comme ceci :

exec tutu [arg_1],[arg_2]... etc

-----------------------------

Si ça sa ne fonctionne pas, il nous faut tes deux procédures pour comprendre.

Merci.

Cdt,
Osiris6880
Osiris6880 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/04/2011, 10h26   #3
Rédacteur/Modérateur

 
Avatar de WOLO Laurent
 
Homme Laurent WOLO
Architecte de base de données
Inscription : mars 2003
Messages : 2 696
Détails du profil
Informations personnelles :
Nom : Homme Laurent WOLO
Âge : 35
Localisation : Congo-Brazzaville

Informations professionnelles :
Activité : Architecte de base de données
Secteur : Finance

Informations forums :
Inscription : mars 2003
Messages : 2 696
Points : 3 917
Points : 3 917
Envoyer un message via Yahoo à WOLO Laurent
Poste ton code et nous allons l'amander.
__________________

Découvrez la FAQ de MS SQL Server.
La chance accorde ses faveurs aux esprits avertis !
WOLO Laurent est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/04/2011, 10h27   #4
Invité régulier
 
Inscription : janvier 2008
Messages : 11
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 11
Points : 8
Points : 8
Précision.

Si tu as une procédure qui te sort plusieurs articles et que tu veux les couleurs de chacun des articles.

Soit tu utilise les jointures ou les curseurs.

As tu des clés primaires, clés étrangères ?
Osiris6880 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/04/2011, 16h05   #5
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Architecte de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2004
Messages : 1 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Citation:
ou les curseurs
Ça il te faut pas le faire hein :-)
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/04/2011, 16h09   #6
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Architecte de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2004
Messages : 1 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Pourquoi utiliser deux procédures stockées?
Si vous créez des procédures pour retourner un jeu de résultat et que vous commencez à devoir imbriquer ceux-ci(comme c'est le cas ici) faites simplement des fonction table.


Vous ne devez pas raisonner côté base de données comme dans votre code CSHARP, ne codez pas une procédure stockée GETIMAGEOFARTICLE() vous perdez tout l’intérêt de la base de donnée c'est à dire sa nature à traiter les données de manière ensembliste et non de manière incrémentale.
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/04/2011, 16h11   #7
Invité régulier
 
Inscription : janvier 2008
Messages : 11
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 11
Points : 8
Points : 8
Citation:
Ça il te faut pas le faire hein :-)
Je suis d'accord avec toi, mais il y a des fois ou on ne peut pas faire autrement.
Car lorsque l'on veut faire des opérations sur chaque ligne retourner par le select, c'est pratique.
Osiris6880 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/04/2011, 09h34   #8
Rédacteur/Modérateur

 
Avatar de WOLO Laurent
 
Homme Laurent WOLO
Architecte de base de données
Inscription : mars 2003
Messages : 2 696
Détails du profil
Informations personnelles :
Nom : Homme Laurent WOLO
Âge : 35
Localisation : Congo-Brazzaville

Informations professionnelles :
Activité : Architecte de base de données
Secteur : Finance

Informations forums :
Inscription : mars 2003
Messages : 2 696
Points : 3 917
Points : 3 917
Envoyer un message via Yahoo à WOLO Laurent
Oui, c'est pratique mais fortement déconseillé. Un SGBDR est optimisé pour faire des traitements ensemblistes pas pour des traitements ligne par ligne.Evitez donc tout parcours itératif.
__________________

Découvrez la FAQ de MS SQL Server.
La chance accorde ses faveurs aux esprits avertis !
WOLO Laurent est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 28/04/2011, 09h59   #9
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Architecte de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2004
Messages : 1 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Citation:
Oui, c'est pratique mais fortement déconseillé. Un SGBDR est optimisé pour faire des traitements ensemblistes pas pour des traitements ligne par ligne.Evitez donc tout parcours itératif.
Tout à fait.

Citation:
Je suis d'accord avec toi, mais il y a des fois ou on ne peut pas faire autrement.
Et bien sachez que c'est extrêmement rare....
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/04/2011, 10h01   #10
Invité régulier
 
Inscription : janvier 2008
Messages : 11
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 11
Points : 8
Points : 8
Entièrement d'accord, à éviter au maximum.
Désolé, j'aurais du le préciser lorsque je l'ai proposé.

Citation:
Et bien sachez que c'est extrêmement rare....
Je suis aussi d'accord avec ça.
Mais quelque fois les performances l'emportent sur la propreté du code.
J'ai l'habitude de travailler sur des tables contenant des milliards de ligne et des fois le plus propre n'est pas le plus performant (c'est très rare - effectivement)

En tous cas j'entend bien que les curseurs sont à utiliser en cas extrême, je partage votre avis à tous les deux.

Merci pour cette discussion. J'éviterais de les utiliser au maximum à partir de maintenant.

Cdt,
Osiris6880
Osiris6880 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/04/2011, 10h32   #11
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Architecte de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2004
Messages : 1 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Citation:
Mais quelque fois les performances l'emportent sur la propreté du code.
Dieu vous entendent c'est plutôt l'inverse dans toutes les boites que j'ai faite...
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/04/2011, 10h42   #12
Rédacteur/Modérateur

 
Avatar de WOLO Laurent
 
Homme Laurent WOLO
Architecte de base de données
Inscription : mars 2003
Messages : 2 696
Détails du profil
Informations personnelles :
Nom : Homme Laurent WOLO
Âge : 35
Localisation : Congo-Brazzaville

Informations professionnelles :
Activité : Architecte de base de données
Secteur : Finance

Informations forums :
Inscription : mars 2003
Messages : 2 696
Points : 3 917
Points : 3 917
Envoyer un message via Yahoo à WOLO Laurent
Tout à fait vrai Iberserk.
__________________

Découvrez la FAQ de MS SQL Server.
La chance accorde ses faveurs aux esprits avertis !
WOLO Laurent est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/04/2011, 11h35   #13
Invité régulier
 
Inscription : janvier 2008
Messages : 11
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 11
Points : 8
Points : 8
Je m'incline, vous avez raison et j'ai tort.
Osiris6880 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/04/2011, 22h52   #14
Invité de passage
 
Homme
Inscription : mars 2011
Messages : 35
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : mars 2011
Messages : 35
Points : 0
Points : 0
Bonjour
et tous d'abord Merci a tous pour vos reponce

Pour imbriquer mes deux procedures stockée
si dans ma procedure stockée : Proc1

Code :
1
2
3
4
-- Mon traitement 
SELECT num, nom, description, hauteur FROM article WHERE num = @numparametre...
 
exec proc2 @monparametre
ça marche quand je le test dans SQL Server mais quand dans mon code C# je veux afficher le resultat je fais

requete = "EXEC DetailArticle " + numarticle;
....

Code :
1
2
3
4
5
6
7
8
9
10
11
 while (dr.READ())
            {
                Label1.Text = dr.GetInt32(0).ToString();
                Label2.Text = dr.GetString(1).ToString();
                Label3.Text = dr.GetString(2).ToString();
                Label4.Text = dr.GetInt32(3);
 
                // Label ou je veux ma liste de couleur
                Label5.Text = dr.GetString(4).ToString();
 
         }
ça fonctionne pas, j'ai pas d'erreur mais mes label ne se remplisse pas ( alors que sa marche sans ma proc2 imbriqué)
Alegreg est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/04/2011, 08h33   #15
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Architecte de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2004
Messages : 1 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Citation:
SELECT num, nom, description, hauteur FROM article
4 colonnes sélectionnées dans le SELECT... un GetString(4) devrait planter pourtant?
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/04/2011, 09h35   #16
Rédacteur/Modérateur

 
Avatar de WOLO Laurent
 
Homme Laurent WOLO
Architecte de base de données
Inscription : mars 2003
Messages : 2 696
Détails du profil
Informations personnelles :
Nom : Homme Laurent WOLO
Âge : 35
Localisation : Congo-Brazzaville

Informations professionnelles :
Activité : Architecte de base de données
Secteur : Finance

Informations forums :
Inscription : mars 2003
Messages : 2 696
Points : 3 917
Points : 3 917
Envoyer un message via Yahoo à WOLO Laurent
Effectivement, puisse que les index commencent par 0.
__________________

Découvrez la FAQ de MS SQL Server.
La chance accorde ses faveurs aux esprits avertis !
WOLO Laurent est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/04/2011, 09h48   #17
Rédacteur/Modérateur

 
Avatar de WOLO Laurent
 
Homme Laurent WOLO
Architecte de base de données
Inscription : mars 2003
Messages : 2 696
Détails du profil
Informations personnelles :
Nom : Homme Laurent WOLO
Âge : 35
Localisation : Congo-Brazzaville

Informations professionnelles :
Activité : Architecte de base de données
Secteur : Finance

Informations forums :
Inscription : mars 2003
Messages : 2 696
Points : 3 917
Points : 3 917
Envoyer un message via Yahoo à WOLO Laurent
As-tu essayé le mode pas-a-pas ?
__________________

Découvrez la FAQ de MS SQL Server.
La chance accorde ses faveurs aux esprits avertis !
WOLO Laurent est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/04/2011, 10h18   #18
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Architecte de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2004
Messages : 1 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
A priori pas de indexOutOfRangeException sur GetString().

Citation:
while (dr.READ())
{
Label1.Text = dr.GetInt32(0).ToString();
Label2.Text = dr.GetString(1).ToString();
Label3.Text = dr.GetString(2).ToString();
Label4.Text = dr.GetInt32(3);

// Label ou je veux ma liste de couleur
Label5.Text = dr.GetString(4).ToString();

}
Essayes GetOrdinal(4).toString() tu verras alors ton erreur...
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/04/2011, 18h05   #19
Invité de passage
 
Homme
Inscription : mars 2011
Messages : 35
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : mars 2011
Messages : 35
Points : 0
Points : 0
Bonjour et merci a tous pour vos reponse

Si mon code c# avais une erreur je pense que c'est parce que je l'avais refais de tete ( stagiaire javais pas enregistrer une copie de mon code).

Mon code proc1:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
CREATE PROCEDURE ArticleDetail 
	@articlechoisi int
 
AS
BEGIN
	SET NOCOUNT ON;
 
SELECT Article.num, Article.nom, description, hauteur, largeur, prix, Couleur.num, Couleur.nom   
FROM
	Article, Couleur, Associer 
    WHERE
	 Article.num = Associer.numarticle 
	 AND Associer.numcouleur = Couleur.num  
	 AND Article.num = @articlechoisi
 
	exec articlecouleur @articlechoisi
 
END
proc2 :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
CREATE PROCEDURE articlecouleur 
	@articlechoisi int
 
AS
 
BEGIN
	SET NOCOUNT ON;
 
	SELECT Couleur.num, Couleur.nom 
	FROM Couleur, Associer, Article
	WHERE Article.num = Associer.numarticle
	AND Associer.numcouleur = Couleur.num
	AND Article.num = @articlechoisi	
END
Code C# :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
 
while (dr.READ())
            {
                Label1.Text = dr.GetInt32(0).ToString();
                Label2.Text = dr.GetString(1).ToString();
                Label3.Text = dr.GetString(2).ToString();
                Label4.Text = dr.GetInt32(3).ToString();
                Label5.Text = dr.GetInt32(4).ToString();
                Label6.Text = dr.GetInt32(5).ToString;
 
                Label7.Text = dr.GetInt32(6).ToString(); 
                Label8.Text = dr.GetString(7).ToString();
           }
Alegreg est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 07h03.


 
 
 
 
Partenaires

Hébergement Web