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

Développement SQL Server Discussion :

Utiliser une variable dans une requête


Sujet :

Développement SQL Server

  1. #1
    Futur Membre du Club
    Inscrit en
    Octobre 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 6
    Points : 5
    Points
    5
    Par défaut Utiliser une variable dans une requête
    Bonjour,

    J'ai écrit un script SQL qui passe en revue l'ensemble des bases existantes sur un serveur. Pour chaque base, j'ai besoin d'exécuter une requête sur la table sys.database_files et de récupérer la valeur retournée, mais j'ai des problèmes de syntaxe.

    Voici le script que boucle sur l'ensemble des bases :
    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
    
    declare c cursor for 
      select name from   sysdatabases 
      where  name like 'DB%' and name <> 'DB000000'
      	          and  (databasepropertyex(name,'Status') = 'ONLINE')
      for read only
    
    declare @name varchar(32)
    declare @cmd  varchar(256)
    declare @size integer
    
    open c
    fetch next from c into @name
    
    while @@fetch_status = 0 
    begin
      --
      -- ici les commandes à exécuter pour chaque base
      --
      fetch next from c into @name
    end
    
    close c
    deallocate c
    A l'intérieur de la boucle, j'ai essayé de faire un USE :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select @cmd = 'use ' + @name
      execute (@cmd)
      select size from sys.sysdatabase_files
    Mais la requête ne s'exécute pas sur la base définie par @name mais sur MASTER.

    Comment faire pour exécuter la requête sur la base définie par @name ?

    J'ai essayé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select size from @name.sys.sysdatabase_files
    qui renvoie une erreur de syntaxe n°156

    J'ai aussi essayé de définir la syntaxe de ma requête dans une variable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select @cmd = 'select size from ' + @name +'sys.sysdatabase_files'
     execute (@cmd)
    Ce qui fonctionne, mais comment faire pour récupérer le résultat de la requête dans une variable ?

    D'avance merci pour votre aide.

    Environnement : SQL2005

  2. #2
    Modérateur
    Avatar de Chtulus
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2008
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2008
    Messages : 3 094
    Points : 8 678
    Points
    8 678
    Par défaut
    Bonjour,

    Il faut relancer un SELECT à la fin qui retourne le résultat après le DEALLOCATE.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    while @@fetch_status = 0 
    begin
      --
      -- ici les commandes à exécuter pour chaque base
      --
      fetch next from c into @name
    end
     
    close c
    deallocate c
     
    IF @name IS NOT NULL
    SELECT @name
    En même temps il me semble qu'il est préférable d'éviter les curseur sur SQL Server.

    « Je ne cherche pas à connaître les réponses, je cherche à comprendre les questions. »
    - Confucius -

    Les meilleurs cours, tutoriels et Docs sur les SGBD et le SQL
    Tous les cours Office
    Solutions d'Entreprise



  3. #3
    Futur Membre du Club
    Inscrit en
    Octobre 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    Merci, mais je ne pense pas que cela réponde à ma question.

    La requête dont je veux récupérer le résultat dans une variable s'exécute à l'intérieur de la boucle, donc bien avant le DEALLOCATE.

    Est-ce que la clause OUTPUT de l'instruction EXECUTE pourrait être utilisée ?



    Citation Envoyé par Chtulus Voir le message
    Bonjour,

    Il faut relancer un SELECT à la fin qui retourne le résultat après le DEALLOCATE.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    while @@fetch_status = 0 
    begin
      --
      -- ici les commandes à exécuter pour chaque base
      --
      fetch next from c into @name
    end
     
    close c
    deallocate c
     
    IF @name IS NOT NULL
    SELECT @name
    En même temps il me semble qu'il est préférable d'éviter les curseur sur SQL Server.


  4. #4
    Modérateur
    Avatar de Chtulus
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2008
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2008
    Messages : 3 094
    Points : 8 678
    Points
    8 678
    Par défaut
    Re,

    Regarde ce sujet de @SQLpro : Eviter les curseurs sur SQL server

    « Je ne cherche pas à connaître les réponses, je cherche à comprendre les questions. »
    - Confucius -

    Les meilleurs cours, tutoriels et Docs sur les SGBD et le SQL
    Tous les cours Office
    Solutions d'Entreprise



  5. #5
    Futur Membre du Club
    Inscrit en
    Octobre 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    Intéressant sur le fond, mais comme je ne suis pas du tout un pro de SQL et que je n'ai pas envie de réécrire mon script de A à Z, je préfèrerais avoir une réponse sur les points évoqués dans mes précédents messages.

    Parce que sur le principe mon script fonctionne à 99% Les cursors sont peut-être gourmand en ressource, mais comme l'exécution du script se fait à 04H00 du matin et que le serveur ne fait rien d'autre à ce moment, ce n'est pas vraiment grave.

    Donc quelqu'un peut-il m'indiquer comment récupérer dans une variable le résultat de la commande EXECUTE ci-dessous ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select @cmd = 'select size from ' + @name +'sys.sysdatabase_files'
     execute (@cmd)
    Ou alors comment inclure dans la requête le nom de la table à traiter, défini par la variable @name. J'ai essayé comme ça mais SQL me dit que la syntaxe n'est pas bonne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select @taille = (select size from @name.sys.sysdatabase_files)
    Alors que si je mets un nom de base en dur (par exemple DBMOD001), ça fonctionne correctement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select @taille = (select size from DBMOD001.sys.sysdatabase_files)

    D'avance merci, et merci pour les réponses déjà apportées.
    Citation Envoyé par Chtulus Voir le message
    Re,

    Regarde ce sujet de @SQLpro : Eviter les curseurs sur SQL server


  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 768
    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 : 21 768
    Points : 52 577
    Points
    52 577
    Billets dans le blog
    5
    Par défaut
    Il faut que vous utilisiez la procédure stockée sp_execute_sql pour ce faire à la place du EXEC (...).

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

  7. #7
    Futur Membre du Club
    Inscrit en
    Octobre 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    sp_executesql je présume (sans le second "_") ?

    Effectivement, ça fonctionne, merci mille fois. J'ai un peu galéré pour trouver une syntaxe qui fonctionne . La voici, au cas où cela pourrait servir à d'autres débutants comme moi qui tomberaient sur cette discussion (je n'ai gardé que ce qui illustre la solution).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    declare @name varchar(32)      
    declare @cmd  nvarchar(256)   
    declare @param nvarchar(256) 
    declare @size varchar(32)      
     
    set @name = 'DBMOD001'      
    set @cmd = N'select @sizeOUT=size from ' + @name + '.sys.database_files where physical_name like ''%.LDF'''    
    set @param= N'@sizeOUT varchar(32) OUTPUT'   
    execute sp_executesql @cmd, @param, @sizeOUT=@size OUTPUT
    A la sortie le résultat de la requête est affecté à la variable @size.

    Citation Envoyé par SQLpro Voir le message
    Il faut que vous utilisiez la procédure stockée sp_execute_sql pour ce faire à la place du EXEC (...).

    A +

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

Discussions similaires

  1. Réponses: 14
    Dernier message: 27/07/2011, 09h50
  2. utilisation d'une variable d'une class dans une autre class
    Par the watcher dans le forum Langage
    Réponses: 7
    Dernier message: 31/08/2010, 14h01
  3. portée d'une variable dans une fonction dans une méthode
    Par laurentg2003 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 29/06/2009, 19h05
  4. Réponses: 4
    Dernier message: 29/01/2008, 11h12
  5. Réponses: 1
    Dernier message: 15/02/2007, 00h24

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