[SQL SERVER]Requête n'acceptant pas une variable

Requête n'acceptant pas une variable [SQL SERVER] - SQL/NoSQL - Programmation

Marsh Posté le 04-08-2006 à 09:34:40    

Bonjour à tous,
 
Je suis coincé sur une pauvre requête qui n'accepte pas une variable dans une proc stock.
 
Je fais un SELECT et je veux mettre une variable dans un IN, la variable étant construite pour mettre toutes les valeurs à comparer entre côtes, séparées par des virgules.
Si je mets la requête SELECT dans une variable et exécute cette variable, la requête est bien exécutée.
Mais, je suis plus viscieux car je ne veux pas afficher un tableau, mais concaténer les valeurs du tableau dans une variable, chose que j'ai déjà fait ailleurs. En stockant la requête dans une variable, j'aurai des soucis pour la déclaration de la variable récupérant et concaténant les valeurs du tableau.
 
Je vous mets le code :  
 

Code :
  1. declare @AMM varchar(1000)
  2. declare @SQL varchar(8000)
  3. declare @liste_MA varchar(1000)
  4. set @liste_MA = ''
  5. set @AMM = ''
  6. set @AMM = '''' + left(@liste_AMM, 7) + ''''
  7. WHILE(len(@liste_AMM)>7)
  8. begin
  9. set @liste_AMM = right(@liste_AMM, len(@liste_AMM)-8)
  10. set @AMM = @AMM + ', ''' + left(@liste_AMM, 7) + ''''
  11. end
  12. SELECT @liste_MA=@liste_MA + COALESCE(cast(tbl1.champ1 as varchar(50)) + ''', ''','') FROM tbl1 INNER JOIN tbl2 INNER JOIN tbl3 ON tbl2.ID_PRO = tbl3.ID INNER JOIN tbl4 ON tbl2.ID_MAT = tbl4.ID ON  tbl1.ID = tbl4.ID_FAM WHERE (tbl3.PRO_AMM IN (@AMM))


 
J'ai entouré là où cela me pose problème... J'ai cherché une fonction pour essayer d'injecter le texte de la variable @AMM en vain.
 
Savez-vous comment je peux procéder ? Dans ma procédure stockée, je devrai utiliser la valeur de la variable @liste_MA après... Dois-je la découper en plusieurs proc stock ou puis-je la faire en une seule ?
 
Le champ PRO_AMM de la table 3 est un champ varchar(10) si cela peut aider...
 
Merci de vos réponses  :jap:


Message édité par Manu la Science le 04-08-2006 à 09:58:41

---------------
Proverbe chinois: il vaut mieux apprendre à pêcher à un mendiant que de lui donner du poisson...
Reply

Marsh Posté le 04-08-2006 à 09:34:40   

Reply

Marsh Posté le 04-08-2006 à 11:07:35    

C'est ici que cela ne va pas : "WHERE (tbl3.PRO_AMM IN (@AMM)) "
 
la variable @AMM stocke bien les bonnes valeurs, si j'exécute la requête en ligne de commande ca passe nickel, si je stocke la requête dans une variable en mettant ...WHERE (tbl3.PRO_AMM IN (' + @AMM + '))', et que j'exécute la requete (sans la concaténation après le select) ca passe aussi nickel.
 
Mais c'est l'exécution directe qui pose problème car la requête ne récupère pas la chaîne texte de la variable @AMM...
 
Comment dois-je faire ?


---------------
Proverbe chinois: il vaut mieux apprendre à pêcher à un mendiant que de lui donner du poisson...
Reply

Marsh Posté le 04-08-2006 à 16:40:51    

crée une table temporaire avec un seul champ de type varchar dedans
 
dans ta boucle, à chaque occurence, fait un insert du "mot" dans cette table
ensuite, dans ta requête, utilise une jointure avec cette table temporaire.

Reply

Marsh Posté le 07-08-2006 à 15:16:10    

Merci Arjuna, je l'ai fait et ca marche très bien comme cela. Les perf n'en seront que meilleures car je ne passerais pas par un "IN".
 
Merci encore


---------------
Proverbe chinois: il vaut mieux apprendre à pêcher à un mendiant que de lui donner du poisson...
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed