Re: Contruire une list de champs dynamiquement.
merci à toi pour ton aide mais j'ai deja trouver...
au fait ca veut dire quoi tarabiscoté ?
voici la solution que j'ai trouvé :
/* RASSEMBLE LES DONNÉES */
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
SET @fld_list = ''
WHILE (@loop <= @i)
BEGIN
SELECT @select = 'SELECT TOP 1 F INTO ##fld_list FROM (SELECT TOP 1 F FROM (
SELECT TOP ' + convert(varchar(3),@loop) + ' 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
) t2 ORDER BY F DESC) t3 ORDER BY F ASC'
EXEC (@select)
SELECT @fld_list = @fld_list + (SELECT F FROM ##fld_list)
SET @fld_list = STUFF(@fld_list, LEN(@fld_list) -10, 0,
LEFT(RIGHT(@fld_list, 4),1) + '.')
DROP TABLE ##fld_list
SET @loop = @loop + 1
END
SET @fld_list = LEFT(@fld_list, LEN(@fld_list) - 1)
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
"Gilles LE BARBIER" <glebarbier_supprimececi@segilog.com> wrote in message
news:%23VE1TMtyHHA.4276@TK2MSFTNGP05.phx.gbl...
>
> Salut Julien
>
> toujours aussi tarabiscotée tes demandes :-)
>
>
> voici une requete qui te permet de retrouver toutes les colonnes de
> toutes tes tables
>
> SELECT table_name,COLUMN_NAME, DATA_TYpe From INFORMATION_SCHEMA.COlumns
> WHERE Table_name in (Select name from sysobjects where xtype = 'U' and
> status > 0)
>
>
> pire voici un bout de requete
>
> récupérant toutes les colonnes de type entier de ma table et les affiches
>
> DECLARE @SQL VarChar(6000),
> @LaColonne VarChar(128),
> @LaTable
>
> SET @LaTable = 'matableamoi'
>
> SET @SQL = ''
> DECLARE CurTables CURSOR
> FOR
> SELECT TABLE_Name + '.' + COLUMN_Name
> FROM INFORMATION_SCHEMA.COlumns
> WHERE TABLE_Name = @LaTable AND DATA_Type = 'int'
> OPEN CurTables
> FETCH Curtables INTO @Lacolonne
> WHILE @@Fetch_Status = 0
> BEGIN
> SET @SQL = @SQL + @Lacolonne + ','
> FETCH Curtables INTO @Lacolonne
> END
> CLOSE CurTables
> DEALLOCATE CurTables
>
> SET @SQL = 'SELECT ' + @SQL + ' 1 FROM ' + @LaTable
> EXEC(@SQL)
>
>
> tu trouvera surement ton bonheur dans tous ca :-)
>
>
> Gilles
>
>
> Julien Bonnier a écrit :
>> 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
>>
|