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 11/01/2012, 15h16   #1
Membre du Club
 
Inscription : janvier 2008
Messages : 243
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 243
Points : 63
Points : 63
Par défaut requêtes éxécutant une procédure stockée

Bonjour,

J'aimerais dans une requête appeler une procédure stockée. Le hic est que d'après ce que j'ai lu ce n'est pas possible.

Ma procédure prend 2 paramètres en entrée (un article et un client) et me retourne une dizaine de valeur.

Le truc est que j'aurais besoin d'exécuter cette procédure pour une multitude d'article d'ou ma question : comment pourrais-je faire pour contourner le problème et obtenir un truc "genre"

Code :
1
2
3
SELECT ar_code, cl_code, maProcedure(ar_code, cl_code) 
FROM UneTable
WHERE cl_code = 'XXX'
D'avance merci et bonne fin de journée

Julius
funkyjul est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2012, 15h37   #2
Candidat au titre de Membre du Club
 
Inscription : janvier 2012
Messages : 7
Détails du profil
Informations forums :
Inscription : janvier 2012
Messages : 7
Points : 10
Points : 10
Peut être que tu n'es pas vraiment obligé d'appeler la procédure. quelle est le code de ta procedure ?
Renaud58 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2012, 15h42   #3
Membre du Club
 
Inscription : janvier 2008
Messages : 243
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 243
Points : 63
Points : 63
Salut Renaud58,

J'ai bien penser modifier le code de la procédure mais... elle est assez "affreuse". De plus, je ne dois faire ça qu'une seule fois. J'aimerais juste éviter de devoir l'appeler 130 fois.

Cela dit voici le code de la dite procédure :

Code :
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
ALTER    PROCEDURE [dbo].[xsp_lbsa_getArtInfo4CC]
	@ar_code nvarchar(30)
	,@cl_code nvarchar(20)
AS
BEGIN
DECLARE @last2 nvarchar(2)
DECLARE @ar_code_brut nvarchar(30)
DECLARE @ar_code_base nvarchar(30)
 
SET NOCOUNT ON;
IF (@ar_code !='')
BEGIN
 
--SELECT @ar_code='1520d1.55TB', @cl_code='0296'
 
SELECT @last2=RIGHT(@ar_code,2), @ar_code_brut= @ar_code
IF EXISTS(SELECT nom FROM [07_traitements] WHERE nom=@last2)
BEGIN
	SELECT @ar_code_base=@ar_code, @ar_code=LEFT(@ar_code,len(@ar_code)-2), @ar_code_brut= @ar_code
END
 
SELECT @ar_code=@ar_code + '%'
 
SET NOCOUNT OFF;
SELECT * FROM (
	SELECT
		articles.ar_code
		--,lbsa_reap_OFEnCours 			as cim_ofnum
		--,isnull(QTECDEE,0) + isnull(QTESTOC,0) 	as cim_ofqte
		,listof 				AS cim_ofnum
		,isnull(tqte,0) 		AS cim_ofqte
		,nom					AS cim_ofnextop
 
		,isnull(stklbsa.stk_lbsa,0)	AS stk_lbsa
		,isnull(articles.ar_stockmin,0)	AS min_lbsa
		,isnull(stkcli.stk_cli,0)	AS stk_cli
		,isnull(smincli.min_cli,0)	AS min_cli
		,isnull(stkothers.stk_oth,0)	AS stk_others
		,isnull(cc.cc_solde,0)		AS cc_solde,
		as_conso_yc, as_consob_yc,
		as_conso_y1, as_consob_y1
 
	FROM
		(SELECT ar_code, lbsa_reap_ofencours, ar_stockmin FROM articles WITH (NOLOCK)
		WHERE
			ar_code NOT IN ('cf','6000') AND
			ar_code LIKE @ar_code 
			AND ar_code NOT LIKE @ar_code_brut + '[0-9]%'
		) AS articles
 
--	LEFT JOIN cimproductimport..[OF] cimof  WITH (NOLOCK)
--		ON cimof.numof = articles.lbsa_reap_OFEnCours
--	LEFT JOIN vlbsa_cimproduct_prochaineOpParOF  WITH (NOLOCK)
--		ON cimof.numof = vlbsa_cimproduct_prochaineOpParOF.numof
 
	LEFT JOIN
		(SELECT 
			li_article
			,sum(li_qte * CASE WHEN li_stock=1 THEN 1 ELSE -1 END) AS stk_lbsa
		FROM
			lignes WITH (NOLOCK)
		WHERE 	li_article LIKE @ar_code
		AND	li_date>'01.01.2007'
		AND	li_stock !=0
		AND	li_nostock =0
		GROUP BY li_article	
		) stklbsa ON stklbsa.li_article = articles.ar_code
 
	LEFT JOIN
		(SELECT 
			li_article
			,sum(li_qte * CASE WHEN li_stock=1 THEN 1 ELSE -1 END) AS stk_cli
		FROM
			lignes WITH (NOLOCK)
		WHERE 	li_article LIKE @ar_code
		AND	li_date>'01.01.2007'
		AND	li_stock !=0
		AND	li_nostock IN (SELECT ts_no FROM stocksclients WHERE cl_code=@cl_code)
		GROUP BY li_article	
		) stkcli ON stkcli.li_article = articles.ar_code
 
	LEFT JOIN
		(SELECT
			ar_code
			,cast(sum(sta_stockmin) AS int)  AS min_cli
		FROM
			stocksMinArticles WITH (NOLOCK)
		WHERE
			ar_code LIKE @ar_code
		AND	ts_no IN (SELECT ts_no FROM stocksclients WHERE cl_code=@cl_code)
		GROUP BY ar_code
		) smincli ON smincli.ar_code = articles.ar_code
 
	LEFT JOIN
		(
		SELECT 
			li_article
			,sum(li_qte * CASE WHEN li_stock=1 THEN 1 ELSE -1 END) stk_oth
		FROM
			lignes WITH (NOLOCK)
		WHERE 	li_article LIKE @ar_code
		AND	li_date>'01.01.2007'
		AND	li_stock !=0
		AND	li_nostock NOT IN (SELECT ts_no FROM stocksclients WHERE cl_code=@cl_code)
		AND	li_nostock !=0
		GROUP BY li_article	
		) stkothers ON stkothers.li_article = articles.ar_code
 
	LEFT JOIN
		(SELECT 
			li_article
			,sum(li_solde) AS cc_solde
		FROM
			lignes WITH (NOLOCK)
		WHERE 	li_article LIKE @ar_code
		AND	li_date>'01.01.2007'
		AND	li_typedoc='CC'
		AND	li_posteouvert!=0
		GROUP BY li_article	
		) cc ON cc.li_article = articles.ar_code
 
	LEFT JOIN vlbsa_cimproduct_articles_of_encours cimof ON cimof.numdossier = articles.ar_code
 
	LEFT JOIN vlbsa_cimproduct_prochaineOpParOF  WITH (NOLOCK)
		ON cimof.numof = vlbsa_cimproduct_prochaineOpParOF.numof
 
	INNER JOIN articles_statistiques WITH (NOLOCK)
		ON articles_statistiques.ar_code = articles.ar_code
 
	WHERE
		articles.ar_code LIKE @ar_code
	) AS subsel
 
	WHERE
		((cim_ofqte+stk_lbsa+stk_cli+stk_others+min_lbsa+min_cli) !=0) OR ar_code=@ar_code_base
 
ORDER BY ar_code
 
END
 
END
Je pense bien qu'il est possible de jouer sur le select et de modifier la condition where mais j'avoue que je ne sais pas trop comment. Ce n'est pas moi qui ai codé cette procédure...
funkyjul est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2012, 16h12   #4
Candidat au titre de Membre du Club
 
Inscription : janvier 2012
Messages : 7
Détails du profil
Informations forums :
Inscription : janvier 2012
Messages : 7
Points : 10
Points : 10
Si c'est pour ne le faire qu'une fois, tu dois avoir moyen d'écrire quelque chose comme ça :

Code :
1
2
3
SELECT 'dbo.xsp_lbsa_getArtInfo4CC(''' + ar_code + ''',''' + cl_code + ''')'
FROM UneTable
WHERE cl_code = 'XXX'
Et ensuite tu exécutes le résultat de cette requête copier/coller dans l'éditeur. Je ne sais pas si ça peut résoudre ton problème... Sinon il y a surement des moyens plus scientifique en utilisant des curseurs :/

A essayer tu dois aussi pouvoir modifier la requête précedente pour faire quelque chose du genre et ainsi tout avoir dans une table temporaire :
Code :
INSERT INTO #temp execute dbo.xsp_lbsa_getArtInfo4CC
Renaud58 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2012, 16h31   #5
Membre du Club
 
Inscription : janvier 2008
Messages : 243
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 243
Points : 63
Points : 63
j'aime bien la 1ère solution , les résultat sont là mais le hic est que je ne peux pas copier l'ensemble des résultats en une fois!! Je vais donc tenter de mettre tout ça dans une table temporaire.
funkyjul est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2012, 16h35   #6
Candidat au titre de Membre du Club
 
Inscription : janvier 2012
Messages : 7
Détails du profil
Informations forums :
Inscription : janvier 2012
Messages : 7
Points : 10
Points : 10
ben essai ca :

Code :
1
2
3
SELECT 'INSERT INTO #temp execute dbo.xsp_lbsa_getArtInfo4CC(''' + ar_code + ''',''' + cl_code + ''')'
FROM UneTable
WHERE cl_code = 'XXX'
mais il faut que tu initialises ta table temporaire.
Renaud58 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2012, 16h48   #7
Membre du Club
 
Inscription : janvier 2008
Messages : 243
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 243
Points : 63
Points : 63
je test et je te donne des news, mais ça me plait
funkyjul est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2012, 16h54   #8
Membre du Club
 
Inscription : janvier 2008
Messages : 243
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 243
Points : 63
Points : 63
Merci beaucoup Renaud58,

Cette solution est certes peu conventionnelle mais fonctionne à merveille pour mes besoins!

Encore merci et bonne fin de journée

Julius
funkyjul est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2012, 16h55   #9
Candidat au titre de Membre du Club
 
Inscription : janvier 2012
Messages : 7
Détails du profil
Informations forums :
Inscription : janvier 2012
Messages : 7
Points : 10
Points : 10
Bon courage pour la suite
Renaud58 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 22h56.


 
 
 
 
Partenaires

Hébergement Web