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 :

pb Procédure stockée dynamique


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Avril 2006
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 19
    Par défaut pb Procédure stockée dynamique
    Bonjour,

    J'essaie de faire une procedure stockée qui prend une valeur d'une colonne passée en paramètre, puis qui la réinsère dans une autre table.

    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
     
    CREATE PROCEDURE arch_broken
        @matid int,
        @typeid int,
        @placeid int,
        @position int,  
        @type_serial varchar(15)
     AS   
       BEGIN TRANSACTION
        DECLARE @old_serial varchar(15) 
     
        SET @old_serial = (select @type_serial from workstation where placeid=@placeid and position=@position);
     
        Print @old_serial
        Insert into operation(..........) VALUES(...,..,...,@old_serial);
     
        IF @@ERROR <>0
            BEGIN
               ROLLBACK TRANSACTION
               RETURN
         END
     
        ELSE 
        BEGIN
            COMMIT
        END
    En réponse j'ai la valeur passée en argument pour @type_serial qui s'affiche (print) j'ai laissé l'insert de coté en attendant.

    Bon le souci c'est que pour que cela marche, il faut que je remplace dans la requete SELECT le @type_serial par le nom de la colonne réel.
    Mais ce n'est pas ce que je veux car cette procédure sera utilisée pour plusieurs colonnes.

    Comme je ne connais pas parfaitement transact SQL, est ce que quelqu'un connait un méthode ou une syntaxe pour que le teste passe?

  2. #2
    Membre émérite
    Avatar de HULK
    Inscrit en
    Juillet 2003
    Messages
    1 276
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 276
    Par défaut
    Il faut faire une requete dynamique et stocker le resultat dans une table tempo

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    DECLARE @QUERY varchar(1500)
     
    SET @QUERY = 'select ' + @type_serial + ' INTO TableTempo from workstation where placeid=' 
    + CAST(@placeid as varchar(5)) + ' and position = ' 
    + CAST(@position as varchar(5))
     
    EXEC(@QUERY)
     
    SET @old_serial = (SELECT * FROM TableTempo)
     
    DROP TABLE TableTempo

  3. #3
    Membre averti
    Inscrit en
    Avril 2006
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 19
    Par défaut
    Merci pour le coup de main !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Server: Msg 268, Level 16, State 3, Line 1
    Cannot run SELECT INTO in this database. The database owner must run sp_dboption to enable this option.
    C'est bon c'est rien...les INSERT INTO étaient désactivés sur le serveur.

    Ca toune, et ca correspond quasiment à ce que je cherche.


    J'ai du faire une variante pour un autre module, et de nouveau un problème:
    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
     
    CREATE PROCEDURE arch_broken_agent
        @matid int,
        @typeid int,
        @placeid int,
        @login varchar(10),  
        @type_serial varchar(15)
     AS   
     
       BEGIN TRANSACTION
        DECLARE @old_serial varchar(15) 
     
     
    DECLARE @QUERY varchar(1500)
     
    SET @QUERY = ' select ' + @type_serial + ' INTO TableTempo from agent where placeid=' + CAST(@placeid as varchar(5)) + ' and login =' +  @login
     
    EXEC(@QUERY)
     
    SET @old_serial = (SELECT * FROM TableTempo)
     
    DROP TABLE TableTempo
     
    Print @old_serial
     
    IF @old_serial <> 'unknown'
        BEGIN
        INSERT INTO operation(serial,operationday,login,typeID,stuffID,placeID,status) VALUES(@old_serial,getdate(),@login,@typeid,@matid,@placeid,'BROKEN')
     
           IF @@ERROR <>0
             BEGIN
               ROLLBACK TRANSACTION
               RETURN
           END
     
           ELSE 
               BEGIN
                   COMMIT
           END
     
    END
    Le bug se situe au niveau de and login =' + @login
    en fait la valeur rendue après le login avec ce code est : OPS17CC alors qu'il me faudrait 'OPS17CC' , cette colonne étant varchar au lieu d'int dans le post précédent.

    J'ai essayé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    and login =" ' + CAST(@login as varchar(8))+ ' " '
    and login =" ' + CAST(@login as varchar(8)) + ' " '
    Et rien n'y fait

  4. #4
    Membre émérite
    Avatar de HULK
    Inscrit en
    Juillet 2003
    Messages
    1 276
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 276
    Par défaut
    tu es sur que ca vient de là, donne moi l'erreur exacte.

  5. #5
    Membre averti
    Inscrit en
    Avril 2006
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 19
    Par défaut
    Appel de la procédure:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    execute arch_broken_agent 14,4,17,'ITS17CC1','serial_head';
    Message d'erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Server: Msg 207, Level 16, State 3, Line 0
    Invalid column name 'ITS17CC1'.
    Server: Msg 208, Level 16, State 1, Procedure arch_broken_agent, Line 19
    Invalid object name 'TableTempo'.
    Server: Msg 266, Level 16, State 1, Procedure arch_broken_agent, Line -1
    Transaction count after EXECUTE indicates that a COMMIT or ROLLBACK TRANSACTION statement is missing. Previous count = 2, current count = 3.
    si je modifia ma procédure avec
    SET @QUERY = ' select ' + @type_serial + ' INTO TableTempo from agent where placeid=' + CAST(@placeid as varchar(5)) + ' and login ="' + @login + '";'

    Meme erreur

  6. #6
    Membre averti
    Inscrit en
    Avril 2006
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 19
    Par défaut
    G trouvé!

    J'ai parsemé de print pour voir ce qui se passait, car il y avait visiblement une erreur de guillemets qui ne passaient pas.

    La solution: au lieu de mettre 'ITS17CC' dans la variable @login,

    Il suffit de mettre '''ITS1CC1''' et la variable @login prend bien 'ITS17CC1'
    => ''' revient a insérer un ' avant et après le texte.

    comme toujours, probleme simple, reponse encore plus simple, mais il faut raisonner en logique informatique,ca ne saute pas toujours aux yeux!

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

Discussions similaires

  1. [SQL Server 2005] Procédure stockée dynamique ?
    Par nitrous007 dans le forum MS SQL Server
    Réponses: 13
    Dernier message: 20/12/2006, 13h54
  2. [SQl 2000] [TSQL] Procédures stockées dynamiques
    Par pihuete dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 17/05/2006, 09h25
  3. procédures stockées dynamiques
    Par Chucky69 dans le forum MS SQL Server
    Réponses: 11
    Dernier message: 30/12/2005, 18h51
  4. SQL dynamique dans une procédure stockée
    Par Amnesiak dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 15/07/2005, 15h17
  5. [FB1.5]Création dynamique d'une procédure stockée ?
    Par Sitting Bull dans le forum SQL
    Réponses: 3
    Dernier message: 10/12/2004, 14h44

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