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 :

[Transact-SQL] Problème avec "execute" dans un "if"


Sujet :

MS SQL Server

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 46
    Points : 38
    Points
    38
    Par défaut [Transact-SQL] Problème avec "execute" dans un "if"
    Bonjour,

    Je suis confronté à un problème lors de l'utilisation de la commande exec.

    Exemple 1 (qui marche) :
    On peut remplacerpar sans que les résultats soient changés.

    Exemple 2 (qui ne marche pas) :
    On ne peut pas remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if exists (select 1)
    begin
    	print('yes');
    end;
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if exists (exec('select 1'))
    begin
    	print('yes');
    end;
    car cela provoque les erreurs
    Syntaxe incorrecte vers le mot clé 'exec'.
    Syntaxe incorrecte vers ')'.
    Quelqu'un a-t-il une idée sur une méthode de contournement pour ce problème ?

  2. #2
    Membre averti
    Avatar de SoBaKa
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2006
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 242
    Points : 349
    Points
    349
    Par défaut
    tout simplement en mettant tout ton test de cette manière:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    EXEC('IF NOT EXISTS (SELECT 1)
    begin
    	print(''yes'');
    end;')
    ?
    ****** Analyse/Développeur .Net

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 46
    Points : 38
    Points
    38
    Par défaut
    Merci pour cette solution qui marche bien, mais (car étant pénible j'aime bien mettre des "mais") :
    - si on remplace le print('yes') par des trucs plus compliqué comme un gros insert sur une 20aine de colonnes,
    - si on ajoute un else avec une grosse requête aussi,
    - ...
    Le résultat est que ça devient pas super lisible (sans compter le fait que ça oblige à doubler toutes les quotes)...

    En tous cas merci !

  4. #4
    Rédacteur/Modérateur

    Avatar de Fabien Celaia
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2002
    Messages
    4 222
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2002
    Messages : 4 222
    Points : 19 551
    Points
    19 551
    Billets dans le blog
    25
    Par défaut
    Le exec () exécute un traitement dans un environnement distinct, donc prenez garde à vos contextes

    Le if exists() recevra non pas le 1, mais le résultat de l'exec
    Sr DBA Oracle / MS-SQL / MySQL / Postgresql / SAP-Sybase / Informix / DB2

    N'oublie pas de consulter mes articles, mon blog, les cours et les FAQ SGBD

    Attention : pas de réponse technique par MP : pensez aux autres, passez par les forums !

  5. #5
    Membre averti
    Avatar de SoBaKa
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2006
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 242
    Points : 349
    Points
    349
    Par défaut
    faut pas oublier dj_lil que tu peux faire EXEC(@requete) et le @requete sera une variable de type VARCHAR...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SET @requete = "SELECT "
    SET @requete = @requete + "* "
    SET @requete = @requete + " FROM maBase"
     
    EXEC(@requete)
    Maintenant faut voir aussi si t'a vraiment besoin de créer des requetes dynamique...
    ****** Analyse/Développeur .Net

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 356
    Points : 406
    Points
    406
    Par défaut
    La méthode que j'emploie est de stocker le résultat de mes requêtes dynamiques dans des tables temporaires locales à la procédure. Je crée ces tables au tout début puis je les utilisent dans ma procédure.

    De manière générale, si tu souhaites travailler avec le résultats de requêtes dynamiques, il faudraient savoir s'il n'est pas intéressant de le stocker dans une table temporaire. Après tout dépend des volumes de données traités.

    Il y a suêrement d'autres manières de faire mais c'est celle-ci que j'emploie. En effet je travaille avec des volumes relativement restraint que je supprime dès que je n'ai plus l'utilité.
    Bon courage pour la suite.

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 46
    Points : 38
    Points
    38
    Par défaut
    Je vais avoir besoin de requêtes dynamiques car je vais devoir utiliser la fonction OPENDATASOURCE, pour aller taper dans une base distante, qu'il faut pouvoir paramétrer à la volée, y compris le nom de la table à aller modifier... donc faire un truc dans ce genre-là.

    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
    declare @serverName varchar(400);
    declare @login varchar(400);
    declare @password varchar(400);
    declare @dbName varchar(400);
    declare @tableName varchar(400);
     
    set @serverName = 'test-server';
    set @login = 'test-login';
    set @password = 'test-pwd';
    set @db = 'test-instance';
    set @tableName = 'test-table';
     
    declare @table nvarchar(3000);
    set @table = 'OPENDATASOURCE(''SQLOLEDB'',''Data Source='+@serverName+';User ID='+@login+';Password='+@password+''').'+@dbName+'.dbo.'+@tableName;
    declare @request nvarchar(2000);
    set @request = 'SELECT count(*) FROM '+@table;
    exec(@request);
    Mais le gros défaut de la méthode est la perte de toute coloration syntaxique, et l'obligation de doubler toutes les quotes.

    Si quelqu'un a une idée géniale pour ne pas avoir ces 2 problèmes, je suis preneur !

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 265
    Points : 314
    Points
    314
    Par défaut
    Utilise un package SSIS

  9. #9
    Membre averti
    Avatar de SoBaKa
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2006
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 242
    Points : 349
    Points
    349
    Par défaut
    Citation Envoyé par dj_lil Voir le message
    Je vais avoir besoin de requêtes dynamiques car je vais devoir utiliser la fonction OPENDATASOURCE, pour aller taper dans une base distante, qu'il faut pouvoir paramétrer à la volée, y compris le nom de la table à aller modifier... donc faire un truc dans ce genre-là.
    Faudrait peut être plus d'info la dessus on pourrait t'aider peut être un peu ^^

    Dans mon entreprise, j'ai du faire des requetes à partir d'un serveur sur un autre serveur... (tout était en réseau local)...

    fait une recherche sur sp_addlinkserver pour voir si ça peut te convenir.
    ****** Analyse/Développeur .Net

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 46
    Points : 38
    Points
    38
    Par défaut
    Citation Envoyé par SoBaKa Voir le message
    Faudrait peut être plus d'info la dessus on pourrait t'aider peut être un peu ^^

    Dans mon entreprise, j'ai du faire des requetes à partir d'un serveur sur un autre serveur... (tout était en réseau local)...

    fait une recherche sur sp_addlinkserver pour voir si ça peut te convenir.
    Le problème avec les serveurs liés, c'est le nom de l'instance de base de données, car tu est obligé de la préciser dans les requêtes. La seule façon que je trouverais de rendre ce nom paramétrable, c'est de faire un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    DECLARE @instance varchar(20);
    set @instance = 'INSTANCE_NAME';
    exec('select * from LINKEDSERVER.'+@instance+'.dbo.TABLENAME');

Discussions similaires

  1. Problème avec date et heure dans sql
    Par samibipbip dans le forum Langage SQL
    Réponses: 2
    Dernier message: 16/12/2011, 19h16
  2. Réponses: 8
    Dernier message: 05/11/2009, 13h55
  3. [SQL] Problème avec nombre d'enregistrements dans une table
    Par zana74 dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 14/08/2006, 13h28
  4. [PL SQL] Problème avec 'case' dans une fonction
    Par divail dans le forum Oracle
    Réponses: 14
    Dernier message: 13/03/2006, 15h50
  5. problème avec masque de saisie dans table
    Par porki dans le forum Access
    Réponses: 6
    Dernier message: 13/10/2004, 08h58

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