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