Re: Contruire une list de champs dynamiquement.
Bon j'ai reussi a le faire en ajoutant un SET @fld_list = '' avant ma boucle
WHILE.
Mais nouveau probleme, quand je remplace les nombres apres mes TOP
(TOP1,TOP10) par mes parametre @loop et @i, SQL me retourne les erreur
suivantes :
Msg 102, Level 15, State 1, Procedure sp_RptRetailSalesCumul, Line 62
Incorrect syntax near '@loop'.
Msg 102, Level 15, State 1, Procedure sp_RptRetailSalesCumul, Line 63
Incorrect syntax near '@i'.
Quelqu'un la cause de ces erreur ?
"Julien Bonnier" <julien@m0851.com> wrote in message
news:e5WquDhyHHA.1188@TK2MSFTNGP04.phx.gbl...
> J'ai oublié de spécifié que j'utilise SQL Server 2005 STD ENG SP2
>
> Merci.
>
> Julien
>
> "Julien Bonnier" <julien@m0851.com> wrote in message
> news:eqRVcBhyHHA.4184@TK2MSFTNGP06.phx.gbl...
>> Bonjours à tous,
>>
>> J'ai un petit problèmes ici .
>>
>> Je tente de programmer une requete asser complexe.
>>
>> Jai 4 tables et je desire contrurire une procédure stockée qui va
>> chercher des donné dans les 4 table mais la n'est pas le hic.
>>
>> Voici un exemple:
>> table1
>> - 3 colonne (fix)
>> table 2
>> nb de colonne variable
>> table 3
>> nb de colonne variable
>> table 4
>> nb de colonne variable
>>
>> La requete que je desire faire ressemblerais a peu pres à ca:
>> SELECT t1.*, t2.col1, t3.col1, t4.col1, t2.col2, t3.col2, t4.col2,
>> t2.col3 [...] FROM table1 AS t1 LEFT JOIN [...]
>>
>> Mais je dois en venir a prendre toute les colonnes des table 2,3,4
>>
>> Donc je me suis dit que je devais construire un liste de champs à aller
>> chercher dans les tables désirer et les stockés dans un paramètre en
>> varchar(1000).
>>
>> J'ai donc lu beaucoup et jai trouver la commande WHILE dans le online
>> book de SQL SERVER. Et j'ai ajouté à ma SP une morceau de code qui est le
>> suivant:
>> ------------------------------------------------------------------------------------------------------------------------------------------------------
>> DECLARE @fld_list varchar(8000), @loop int, @i int
>>
>> [...]
>>
>> SET @i=(SELECT COUNT(*)
>>
>> FROM information_schema.columns
>>
>> WHERE TABLE_NAME IN ('ut_RptRetailSaleSCumulQte',
>> 'ut_RptRetailSaleSCumulProfit', 'ut_RptRetailSaleSCumulSales')
>>
>> AND COLUMN_NAME<>'Style')
>>
>> SET @loop = 1
>>
>> print (CONVERT(varchar(5), @loop) + ' _ ' + CONVERT(varchar(5), @i))
>>
>> WHILE (@loop <= @i)
>>
>> BEGIN
>>
>> SET @fld_list ='' + @fld_list + (SELECT TOP 1 F FROM (
>>
>> SELECT TOP 10
>> REPLACE(REPLACE(REPLACE(TABLE_NAME,'ut_RptRetailSa leSCumulQte','Q'),'ut_RptRetailSaleSCumulProfit',' P'),'ut_RptRetailSaleSCumulSales','SL')
>> + '.' + COLUMN_NAME + ',' AS F
>>
>> FROM information_schema.columns
>>
>> WHERE TABLE_NAME IN ('ut_RptRetailSaleSCumulQte',
>> 'ut_RptRetailSaleSCumulProfit', 'ut_RptRetailSaleSCumulSales')
>>
>> AND COLUMN_NAME<>'Style'
>>
>> ORDER BY F ASC
>>
>> ) AS t2 ORDER BY F ASC)
>>
>> SET @loop = @loop + 1
>>
>> print (CONVERT(varchar(5), @loop) + ' _ ' + CONVERT(varchar(5), @i))
>>
>> print(@fld_list)
>>
>> END
>>
>> print('g' + @fld_list)
>>
>> [...]
>>
>> ------------------------------------------------------------------------------------------------------------------------------------------------------
>>
>> Ne tennez pas compte des top X qui ne sont pas encore setter comme il
>> faut.
>>
>> Mon probleme c'est que quand ma boucle (WHILE) est terminée et qu'elle
>> atteint la ligne qui dit END ma procédure stockée arrete de s'exécuté. Je
>> n'atteint donc jamais la ligne:
>>
>> print('g' + @fld_list)
>>
>> Et aussi mon autre probleme c'est que print(@fld_list) retourne toujours
>> une chaine avec un espace seulement.
>>
>> Cepandant ce second probleme est peut-etre du a mes TOP qui ne sont pas
>> setter mais je ne crois pas car si j'exécute la requete SELECT j'obtient
>>
>> P.LAM2PROFIT,
>>
>>
>>
>> Est-ce que quelqu'un sait comment utilisé une boucle (WHILE) à
>> l'intérieur d'une proc stockée ?
>>
>> Ou est-ce que quelqu'un a une alternative à ma solution (qui ne
>> fonctionne pas pour l'instant)?
>>
>>
>>
>> Merci en avance!
>>
>>
>>
>> Julien
>>
>>
>
>
|