IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MS SQL Server Discussion :

Comment rendre dynamique les noms des colonnes d'une vue


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté

    Profil pro
    En reconversion
    Inscrit en
    Novembre 2007
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : En reconversion

    Informations forums :
    Inscription : Novembre 2007
    Messages : 180
    Par défaut Comment rendre dynamique les noms des colonnes d'une vue
    Bonjour,
    Je veux pouvoir rendre dynamique le nom des colonnes d'une vue, par exemple :

    SELECT 'test' AS [Sep N] (dans MS SQL 2005)

    ici je veux que s'écrive au lieu de [Sep N], [Sep 2009].
    J'obtiens cela avec SELECT 'Sep '+CAST(YEAR(getdate()) AS CHAR(4)) mais impossible d'écrire cela après "AS".
    Je suppose que cela est faisable avec du SQL dynamique mais je n'y arrive pas, d'autre part j'utilise ici une vue et je me demande si je peux utiliser du sql dynamique dans ce cas.
    Je sais que vous allez me répondre de le faire coté client mais ici la requête est récupéré dans Excel. Il est alors facile de le faire mais cela implique l'utilisation de vba et selon le poste sur lequel cela sera exécuté cela pourrait ne pas fonctionner (activation des macros, niveau de sécurité, etc), je préfère donc le faire coté serveur dans MS SQL.
    Merci pour votre aide

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 010
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 22 010
    Billets dans le blog
    6
    Par défaut
    Faites cela dans une procédure stockée en utilisant du SQL dynamique.

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Membre expérimenté

    Profil pro
    En reconversion
    Inscrit en
    Novembre 2007
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : En reconversion

    Informations forums :
    Inscription : Novembre 2007
    Messages : 180
    Par défaut
    Je me doutais de cette réponse mais d'une part je n'ai jamais fait de sql dynamique et qq tests n'ont rien donné donc je suis totalement perdu à ce niveau, et d'autre part je ne pourrai pas appeler le résultat de la procédure dans excel à part peut être avec du vba mais je veux éviter cela puisque le souci est justement le fonctionnement des macros dans excel.

    Pour résumé si je comprends bien il n'y a donc pas de solution dans une vue, je vais dans ce cas ajouter une colonne que je masquerai dans excel et qui indiquera l'année N, ensuite qq formules sous excel et les titres seront dynamiques.

  4. #4
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    Bonjour,

    Je suppose que cela est faisable avec du SQL dynamique mais je n'y arrive pas, d'autre part j'utilise ici une vue et je me demande si je peux utiliser du sql dynamique dans ce cas.
    Essayez ceci :

    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    CREATE TABLE TbClient
    (
    	IDClient INT IDENTITY NOT NULL CONSTRAINT PK_TbClient PRIMARY KEY,
    	NomClient VARCHAR(20) NOT NULL,
    	DateCreation DATETIME NOT NULL CONSTRAINT DF_TbClient_DateCreation DEFAULT GETDATE()
    )
    GO
     
    CREATE TABLE TbTypeNumeroTelephone
    (
    	IDTypeNumeroTelephone TINYINT IDENTITY NOT NULL CONSTRAINT PK_TbTypeNumeroTelephone PRIMARY KEY,
    	NomTypeNumeroTelephone VARCHAR(13) NOT NULL
    )
    GO
     
    CREATE TABLE TbTelephone
    (
    	IDTelephone INT IDENTITY NOT NULL CONSTRAINT PK_TbTelephone PRIMARY KEY,
    	IDClient INT NOT NULL CONSTRAINT FK_TbTelephone_IDClient FOREIGN KEY (IDClient) REFERENCES dbo.TbClient (IDClient),
    	Numero VARCHAR(20) NOT NULL CONSTRAINT CHK_TbTelephone_Numero CHECK (Numero LIKE '[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'),
    	IDTypeNumeroTelephone TINYINT CONSTRAINT FK_TbTelephone_IDTypeNumero FOREIGN KEY (IDTypeNumeroTelephone) REFERENCES dbo.TbTypeNumeroTelephone (IDTypeNumeroTelephone),
    	CONSTRAINT UQ_TbTelephone_IDClient_IDTypeNumeroTelephone UNIQUE (IDClient, IDTypeNumeroTelephone)
    )
    GO
     
    INSERT INTO dbo.TbClient (NomClient) VALUES ('Patic')
    INSERT INTO dbo.TbClient (NomClient) VALUES ('ElSuket')
    GO
     
    INSERT INTO dbo.TbTypeNumeroTelephone (NomTypeNumeroTelephone) VALUES ('Professionnel')
    INSERT INTO dbo.TbTypeNumeroTelephone (NomTypeNumeroTelephone) VALUES ('Mobile')
    INSERT INTO dbo.TbTypeNumeroTelephone (NomTypeNumeroTelephone) VALUES ('Personnel')
    INSERT INTO dbo.TbTypeNumeroTelephone (NomTypeNumeroTelephone) VALUES ('Fax')
    GO
     
    INSERT INTO dbo.TbTelephone VALUES (1, '0100000000', 1)
    INSERT INTO dbo.TbTelephone VALUES (2, '0111111111', 1)
    INSERT INTO dbo.TbTelephone VALUES (1, '0622222222', 2)
    INSERT INTO dbo.TbTelephone VALUES (2, '0633333333', 2)
    GO
     
    CREATE VIEW VTelephoneProfessionnelClient
    AS
    SELECT CLI.NomClient,
    		TEL.Numero
    FROM dbo.TbClient CLI
    JOIN dbo.TbTelephone TEL ON TEL.IDClient = CLI.IDClient
    JOIN dbo.TbTypeNumeroTelephone TYPE_TEL ON TYPE_TEL.IDTypeNumeroTelephone = TEL.IDTypeNumeroTelephone
    WHERE TYPE_TEL.NomTypeNumeroTelephone = 'Professionnel'
    GO
     
    DECLARE @SQL VARCHAR(255),
    		@TypeTel VARCHAR(13),
    		@AliasClient VARCHAR(13)
     
    SELECT @TypeTel = 'Professionnel',
    		@AliasClient = 'Nom du client'
     
    SET @SQL = 'SELECT NomClient AS [' + @AliasClient + '], Numero AS [N° de téléphone ' + @TypeTel + '] FROM dbo.VTelephoneProfessionnelClient'
    -- PRINT @SQL
    EXEC (@SQL)
     
    -- Ou encore
    CREATE PROCEDURE usp_Telephone
    	@_TypeTel VARCHAR(13),
    	@_AliasClient VARCHAR(13)
    AS
    BEGIN
    	DECLARE @SQL VARCHAR(255)
    	SET @SQL = 'SELECT NomClient AS [' + @_AliasClient + '], Numero AS [N° de téléphone ' + @_TypeTel + ']' +
    				' FROM dbo.VTelephoneProfessionnelClient'
    	-- PRINT @SQL
    	EXEC (@SQL)
    END
     
    EXEC dbo.usp_Telephone 'Professionnel', 'Nom du client'
    Retourne :

    Nom du client N° de téléphone Professionnel
    -------------------- -----------------------------
    Patic 0100000000
    ElSuket 0111111111
    Quelques exemples de macros Excel exécutant des requêtes ici

    @++

  5. #5
    Membre expérimenté

    Profil pro
    En reconversion
    Inscrit en
    Novembre 2007
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : En reconversion

    Informations forums :
    Inscription : Novembre 2007
    Messages : 180
    Par défaut
    Merci beaucoup pour ce script cela me donne une meilleur idée, j'avais bien essayé mais cela ne fonctionnait pas, je ne savais comment écrire "[' + @AliasClient + ']".
    Le problème est que je ne pourrais pas appeler une procédure stockée avec excel via query (ultra simple), il faut utiliser vba avec ado. Utiliser les macros sous excel pose trop souvent des soucis, j'essaie donc de limiter cela. Il peut y avoir des problèmes avec le niveau de sécurité, l'installation des options d'excel, le fait qu'il faut dans ce cas activer les macros au lancement, etc, bref je ne maitrise pas la partie client. Sinon le plus simple est d'ajouter une macro qui va récupérer la date où on lance la maj du tableau puis utiliser cette date pour créer les en-têtes de colonnes.
    Merci encore pour votre aide.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Afficher les noms des colonnes d'une table
    Par Imageek dans le forum SQL
    Réponses: 2
    Dernier message: 25/03/2010, 17h20
  2. Réponses: 5
    Dernier message: 21/09/2009, 03h03
  3. confiner les noms des colonnes d'une table
    Par grecko21 dans le forum Zend_Db
    Réponses: 1
    Dernier message: 24/08/2009, 17h04
  4. Afficher les noms des colonnes d'une table
    Par witch dans le forum Requêtes
    Réponses: 10
    Dernier message: 07/10/2008, 13h25
  5. Recupérer les nom des colonnes d 'une table
    Par mitnick2006 dans le forum JDBC
    Réponses: 2
    Dernier message: 08/05/2008, 21h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo