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 :

[2005] Mettre une requete SQL entière dans un @paramètre d'une procédure stockée ?


Sujet :

MS SQL Server

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 224
    Points : 99
    Points
    99
    Par défaut [2005] Mettre une requete SQL entière dans un @paramètre d'une procédure stockée ?
    Bonjour,

    Pour pouvoir récupérer l'identité auto-incrémentée d'un INSERT je passe par une procédure stockée dans la quelle je fais :
    - la requete INSERT
    - un SELECT SCOPE_IDENTITY();

    Le problème est que je suis obligé de créer sur le serveur sql, autant de procédure stockée que je n'ai de tables.

    Donc la question est de savoir s'il est possible de ne faire qu'une seule procédure stockée dans laquelle je passe en paramètre ma requête Sql toute entière..

    quelque chose comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE PROCEDURE p_recup_autoincrement 
      @requeteSql text,
      @nouvelId int output
    AS
      @requeteSql;
      SET @nouvelId = SCOPE_IDENTITY();
    GO
    mais à la création de la procédure sur le serveur ça ne passe pas j'ai l'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    The following error occured while executing the query:
    Server: Msg 102, Level 15, State 1, Line 5
    Syntaxe incorrecte vers '@requeteSql'.
    Avez vous une idée de comment je pourrais faire ?

    d'avance merci

  2. #2
    Membre du Club Avatar de Franck2mars
    Inscrit en
    Mai 2003
    Messages
    119
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2003
    Messages : 119
    Points : 64
    Points
    64
    Par défaut
    Tu devrais plutot faire comme ca


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CREATE PROCEDURE p_insert_descripteur 
      @requeteSql text,
      @nouvelId int output
    AS
      declare @requeteSql;
    begin
        set @requetesql="......."
        exec(@requetesql)
        SET @nouvelId = SCOPE_IDENTITY();
    GO

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 224
    Points : 99
    Points
    99
    Par défaut
    merci.. j'étais justement en train de regarder la doc sur EXECUTE..

    je vais essayer comme tu me le conseilles et je vous tiens au courant

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 224
    Points : 99
    Points
    99
    Par défaut
    Au fait pourquoi le begin ?
    (ma procédure est déjà dans une transaction j'ai oublié de le dire)
    (p.s. je débute avec sql server)

    merci

  5. #5
    Membre du Club Avatar de Franck2mars
    Inscrit en
    Mai 2003
    Messages
    119
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2003
    Messages : 119
    Points : 64
    Points
    64
    Par défaut
    Tu peux nous mettre le code en entier de ta procédure stockée?

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 224
    Points : 99
    Points
    99
    Par défaut
    Oui c'est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE PROCEDURE p_recup_autoincrement 
      @requeteSql text,
      @nouvelId int output
    AS
      EXEC @requeteSql;
     
      SET @nouvelId = SCOPE_IDENTITY();
    GO

    J'essaye comme ça, mais je suis confronté à un autre problème, c'est que ma @requeteSql doit être une requête paramétrée et là je ne sais pas comment faire, et si c'est envisageable..

    si tu as une idée.. je suis preneur

  7. #7
    Membre du Club Avatar de Franck2mars
    Inscrit en
    Mai 2003
    Messages
    119
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2003
    Messages : 119
    Points : 64
    Points
    64
    Par défaut
    tu peux faire comme ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SET @requetesql='select * from '+@nomtable+
    'where '+@champ+'="'+@parametre+'"'
    Si c'est bien ce que tu veux faire

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 224
    Points : 99
    Points
    99
    Par défaut
    merci Franck,

    c'est peut être la bonne piste, merci.

    mais la requête que je lui envoie peut avoir N paramètres..

    dans ce cas il faudrait que je puisse faire quelque chose dans ce genre :

    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
    CREATE PROCEDURE p_recup_autoincrement
      @nomtable varchar(100),
      @nbChampsParamètres int,
     
      FOR (i=0; i<nbChampsParamètres; i++) {
        @['champ'+i] varchar(100),
        @['param'+i] text,
      }
     
        @nouvelID int output
     
    AS
     
      DECLARE @requeteSql;
     
      // construction de ma requete
      SET @requeteSql = 'INSERT INTO ' + @nomtable + ' (';  
      FOR (i=0; i<nbChampsParamètres; i++) {
        @requeteSql += @['champ'+i];
        IF (i != nbChampsParamètres-1) @requeteSql += ',';
      }
      @requeteSql += ') VALUES(';
      FOR (i=0; i<nbChampsParamètres; i++) {
        @requeteSql += @['param'+i];
        IF (i != nbChampsParamètres-1) @requeteSql += ',';
      }
      @requeteSql += ');';
     
      EXEC @requeteSql;
     
      SET @nouvelId = SCOPE_IDENTITY();
    GO

    Et par contre je ne sais pas si c'est possible de :
    - mettre des for et des if dans du transact-sql (je vais voir la doc)
    - mettre des for et des if pour déclarer les paramètres d'une procédures stockée
    - déclarer des paramètres dynamiquement et quelle est la syntaxe..

    donc il faut que je me documente, mais si tu as une idée, merci !

  9. #9
    Membre du Club Avatar de Franck2mars
    Inscrit en
    Mai 2003
    Messages
    119
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2003
    Messages : 119
    Points : 64
    Points
    64
    Par défaut
    En fait tu veux construire une requete dynamiquement en fonction des parametres que tu lui envoies?

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 224
    Points : 99
    Points
    99
    Par défaut
    oui finalement ça reviendrai à ça.

    je ne pensais pas en arriver la mais cela semble une solution à mon problème.

  11. #11
    Membre du Club Avatar de Franck2mars
    Inscrit en
    Mai 2003
    Messages
    119
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2003
    Messages : 119
    Points : 64
    Points
    64
    Par défaut
    Alors il faut que tu construises dynamiquement ta requete de la manière suivante par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while condition
    begin
                       set @query=@query + @parametres.....	                           end

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 224
    Points : 99
    Points
    99
    Par défaut
    Bonjour Franck,

    merci pour ton aide..

    finalement je laisse tomber cette solution..

    je viens de m'aperçevoir que je ne suis pas obligé de passer par une procédure stockée, car depuis mon appli ASP.NET si j'envoie plusieurs requêtes en même temps, je recevrai bien le bon ID qui vient d'être auto-généré car il s'git d'un lot d'instruction et SQL SERVER 2005 gère les lots d'instructions reçu depuis une application.. et les exécutent en une seule fois :

    http://msdn2.microsoft.com/fr-fr/library/ms175502.aspx

    pour bien comprendre mon problème il faudrait relire mes anciens posts :
    http://www.developpez.net/forums/sho...d.php?t=255328
    http://www.developpez.net/forums/sho...d.php?t=244810

    encore merci..

  13. #13
    Membre du Club Avatar de Franck2mars
    Inscrit en
    Mai 2003
    Messages
    119
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2003
    Messages : 119
    Points : 64
    Points
    64
    Par défaut
    De rien, tu peux clore le sujet alors... Bon courage
    @ +

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 224
    Points : 99
    Points
    99
    Par défaut
    oui c'est fait.
    merci et bon aprem !

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

Discussions similaires

  1. [MySQL] Manque 1 champ dans l'affichage d'une requete sql
    Par poleta77 dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 08/01/2010, 09h45
  2. probléme dans l'excécution d'une requete sql
    Par saraenim dans le forum Windows Forms
    Réponses: 1
    Dernier message: 17/10/2008, 14h55
  3. Mettre type de données monetaire dans le champ d'une requete
    Par emirov dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 02/05/2008, 14h53
  4. Réponses: 14
    Dernier message: 10/01/2007, 10h12
  5. Comment executer une requete sql delete dans une jsp ?
    Par DarkWark dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 24/05/2006, 16h59

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