|
|
|
|
||||||
![]() |
|
|
LinkBack | Outils de la discussion |
|
|
#1 (permalink) |
|
Messages: n/a
Hébergeur: |
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 |
|
|
|
#2 (permalink) |
|
Messages: n/a
Hébergeur: |
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 > > |
|
|
|
#3 (permalink) |
|
Messages: n/a
Hébergeur: |
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 >> >> > > |
|
|
|
#4 (permalink) |
|
Messages: n/a
Hébergeur: |
J'ai réussi à faire ce que je voulais en utilisant un EXEC
Merci Julien "Julien Bonnier" <julien@m0851.com> wrote in message news:uFpp8thyHHA.3696@TK2MSFTNGP03.phx.gbl... > 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 >>> >>> >> >> > > |
|
|
|
#5 (permalink) |
|
Messages: n/a
Hébergeur: |
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 > > |
|
|
|
#6 (permalink) |
|
Messages: n/a
Hébergeur: |
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 >> |
|
![]() |
| Outils de la discussion | |
|
|