Bonjour,
je dois fournir une requetes à plusieurs de mes clients pour un reporting adhoc (qui va être effectué via PowerBI et un cube SSAS Tabulaire => donc je dois avoir un modèle générique et standard qui pourra être déployer chez tous les clients), certaines tables contienne des colonnes qui sont ajoutés à la volé au niveau du paramétrage de l'ERP donc impossible de savoir les colonnes qui sont ajoutés sur chaque base de données.
je peux avoir les colonnes qui ont été ajouté à partir d'une table de paramétrage. j'ai développé donc une requête pour retourner les 10 premières colonnes de chaque table.
- j'ai pensé à mettre ma requete dans une fonction table pour retourner une variable table avec mais malheureusement les udf n'accèptent pas le sql dynamique
- les tables peuvent avoir de 0 à 69 colonnes dynamique et je vais prendre seulement les 10 premières colonnes donc un petit problème pour les tables qui contiennent un nombre de colonne < 10

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
 
CREATE FUNCTION reporting.udfInfoLibre
(
  @file NVARCHAR(MAX)
)
RETURNS @Libre TABLE
(
		CT_Num VARCHAR(10), 
		 Info1  VARCHAR(69), 
		 Info2  VARCHAR(69), 
		 Info3  VARCHAR(69)
		--,
		--Info4 varchar(69),
		--Info5 varchar(69),
		--Info6 varchar(69),
		--Info7 varchar(69),
		--Info8 varchar(69),
		--Info9 varchar(69),
		--Info10 varchar(69)
)
AS
     BEGIN
         DECLARE @col NVARCHAR(MAX);
         DECLARE @sql NVARCHAR(MAX);
         SELECT @col = COALESCE(@col + ',[' + CAST(CB_Name AS VARCHAR) + ']', '[' + CAST(CB_Name AS VARCHAR) + ']') + ' as ' + t.alias
         FROM
         (
             SELECT CB_Name AS CB_Name, 
                    'Info' + CAST(ROW_NUMBER() OVER(
                    ORDER BY CB_Pos) AS VARCHAR(3)) AS alias
             FROM cbSysLibre
             WHERE CB_File = @file
                   AND CB_Pos <= 10
         ) AS t;
         SET @sql = ' SELECT CT_Num ,' + @col + ' FROM F_COMPTET WHERE CT_Type = 0';
         EXEC sp_executesql 
              @sql;
         RETURN;
     END;