Re: Contruire une list de champs dynamiquement.
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
>
>
|