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

Langage SQL Discussion :

SQL SERVER DROP VIEW [@variable]


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Septembre 2008
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 30
    Par défaut SQL SERVER DROP VIEW [@variable]
    Bonjour à tous et meilleurs voeux!

    Je commence la programmation sous SQL SERVER, et j'ai le programme suivant:

    je dois réaliser une vue par contrat. Pour cela, je veux faire une boucle basée sur la liste de mes contrats.
    1) Je crée un curseur basé sur la liste des contrats. Je mets le contrat en cours dans la variable @contrat_vue.
    2) Je vérifie si la vue existe déjà. Si oui, je la supprime.
    3) Je crée la nouvelle vue. Son nom est 'DR_'+@contrat_vue (SET @Nom_vue= 'DR_'+@Contrat_vue)

    Malheureusement, je n'arrive pas à utiliser dans DROP VIEW et le CREATE VIEW ma variable @Contrat_vue.
    Je n'arrive qu'à mettre un nom en dur, mais comme il s'agit d'une boucle, il faut utiliser ma variable @Contrat_vue.

    Voici ci-dessous une partie de mon code. Je n'ai pas mis le CREATE VIEW.

    Merci d'avance à tous ceux qui me répondront.
    à +


    -- Déclaration de variables
    DECLARE @Contrat_vue VARCHAR(10)
    DECLARE @Nom_vue VARCHAR(20)


    Declare CURSEUR_VUE_DR cursor for
    Select distinct contrat
    From Tanalyses_entete

    Open CURSEUR_VUE_DR

    Fetch next from CURSEUR_VUE_DR
    into @Contrat_vue

    While @@fetch_status=0
    Begin

    SET @Nom_vue= 'DR_'+@Contrat_vue

    if (select count(*) from sysobjects where name='@Nom_vue') >0
    drop view @Nom_vue

    PRINT 'La vue ' + @Nom_vue + ' a été supprimée.'
    GO

    Fetch next from CURSEUR_VUE_DR
    Into @Contrat_vue

    End

    Close CURSEUR_VUE_DR
    DeAllocate CURSEUR_VUE_DR
    (SQL SERVER 2005)

  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 002
    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 002
    Billets dans le blog
    6
    Par défaut
    je ne voit pas l'intérêt de créer de multiple vue de ce genre et l'utilisation des curseur est déconseillé !
    Vous ne pouvez pas modifier les tables systèmes. SI vous le pouviez, le serveur serait irrémédiablement mort.
    Les tables systèmes (qui sont en fait des vues, les accès tables système n'existent plus) sont protégées en écriture.
    Pour faire votre DROP de vus vous devez le faire avec du SQL dynamique comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    DECLARE @SQL NVARCHAR(max);
    SET @SQL = '';
    SELECT @SQL = @SQL + 'DROP VIEW [' + TABLE_SCHEMA +'].[' + TABLE_NAME +'];'
    FROM INFORMATION_SCHEMA.TABLES
    WHERE TABLE_TYPE = 'VIEW';
    EXEC (@SQL);
    En revanche il serait beaucoup plus intelligent de réaliser une fonction table paramétrable avec le n° de contrat...

    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 très actif Avatar de hazamor
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2008
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2008
    Messages : 179
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ...WHERE TABLE_TYPE = 'VIEW';
    A +
    Cette requete va supprimer tous les vues, mais ce n'est pas le cas.

    Est-il possible de faire comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select nb=count(*) from sysobjects where name=+@Nom_vue;
    if (nb) >0
    exec('drop view' + @Nom_vue);

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 002
    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 002
    Billets dans le blog
    6
    Par défaut
    Soyez plus clair car là il est difficile de vous comprendre !

    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/ * * * * *

  5. #5
    Membre très actif Avatar de hazamor
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2008
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2008
    Messages : 179
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    DECLARE @SQL NVARCHAR(max);
    SET @SQL = '';
    SELECT @SQL = @SQL + 'DROP VIEW [' + TABLE_SCHEMA +'].[' + TABLE_NAME +'];'
    FROM INFORMATION_SCHEMA.TABLES
    WHERE TABLE_TYPE = 'VIEW';
    EXEC (@SQL);
    Vous avez proposé cette requete, mais remarquons qu'elle selectionne tous les vues qui existent dans le schema de BD. Pour cela j'ai proposer d'essayer avec une modification de la première requete:
    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
     Déclaration de variables
    DECLARE @Contrat_vue VARCHAR(10)
    DECLARE @Nom_vue VARCHAR(20)
    
    
    Declare CURSEUR_VUE_DR cursor for 
    Select distinct contrat 
    From Tanalyses_entete
    
    Open CURSEUR_VUE_DR
    
    Fetch next from CURSEUR_VUE_DR 
    into @Contrat_vue 
    
    While @@fetch_status=0 
    Begin 
    
    SET @Nom_vue= 'DR_'+@Contrat_vue
    
    if (select count(*) from sysobjects where name='@Nom_vue') >0 
    exec('drop view'+ @Nom_vue);
    
    PRINT 'La vue ' + @Nom_vue + ' a été supprimée.'
    GO
    
    Fetch next from CURSEUR_VUE_DR 
    Into @Contrat_vue 
    
    End
    
    Close CURSEUR_VUE_DR
    DeAllocate CURSEUR_VUE_DR

  6. #6
    Membre averti
    Inscrit en
    Septembre 2008
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 30
    Par défaut
    Bonjour SQLPro et hazamor!

    Merci beaucoup pour vos réponses!

    J'ai testé le code que tu m'a écrit SQLPro, mais je n'ai pas réussi à l'exécuter.
    Alors j'ai testé ton code hazamor (le dernier) et j'ai réussi à le faire fonctionner.
    Déjà merci beaucoup de m'avoir aidé pour cette partie!

    Je me permets de vous demander une autre faveur... savez-vous comment faire pour créer mes vues dont le nom est basé sur ma variable @Nom_vue?
    SQL n'aime pas du tout mon CREATE VIEW [@Nom_vue]!

  7. #7
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 002
    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 002
    Billets dans le blog
    6
    Par défaut
    Il faut tout faire en SQL dynamique.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    DECLARE @SQL VARCHAR(max)
    SET @SQL = 'CREATE VIEW [' + @Nom_vue +'] ...
    EXEC (@SQL)
    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/ * * * * *

  8. #8
    Membre averti
    Inscrit en
    Septembre 2008
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 30
    Par défaut
    Bonjour SQLPro
    Déjà merci beaucoup pour ta réponse!

    J'essaye de faire mon programme en SQL dynamique mais je n'arrive pas à utiliser le bout de programme que tu m'as proposé pour le DROP.
    Et en fait, celui qu'a proposé hazamor ne fonctionne pas. Il affiche bien "la vue a été supprimée" mais il ne fait rien (pas de suppression).

    Et pour le CREATE, le bout de programme que tu m'as proposé fonctionne bien. Mais je n'arrive pas à lui ajouter une condition where dans le
    SET @SQL = 'CREATE VIEW [' + @Nom_vue +'] ...
    "WHERE contrat=@Contrat_vue": syntaxe est toujours incorrecte! J'ai essayé avec des ', des '', des +, des '+... Je n'arrive pas à trouver le langage qui convient.

    Veux-tu bien m'aider encore un petit peu pour que j'arrive au bout?

Discussions similaires

  1. Querytables.add sur SQL server, problème de variables SQL
    Par sms5962 dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 10/01/2013, 15h21
  2. SQL SERVER - DROP TRIGGER
    Par bobobo7569 dans le forum Développement
    Réponses: 2
    Dernier message: 06/01/2012, 09h51
  3. [SQL Server] Insert et Variable de type Table
    Par patriceharel dans le forum Développement
    Réponses: 3
    Dernier message: 10/02/2009, 16h32
  4. [SQL SERVER 2005] Probleme variable local
    Par nashouille dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 09/05/2006, 11h16
  5. Pb avec DROP COLUMN sous SQL Server 2000
    Par debailleul dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 03/03/2004, 14h38

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