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 :

Ma requete s'execute qu'une seule fois dans mon curseur


Sujet :

Développement SQL Server

  1. #1
    Candidat au Club
    Inscrit en
    Mars 2008
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Ma requete s'execute qu'une seule fois dans mon curseur
    Bonjour,

    Voilà, j'ai une procédure stockée qui récupère des données dans une table pour les insérées dans une autre, SIMPLE. Mais voila, quand je l'exécute il n'insert qu'une seule ligne, la première.

    J'ai essayé de juste mettre un compteur pour voir si le curseur tourné normalement, et c bon, il tourne.

    La requête de mon curseur est correcte.

    Il a beaucoup de variable pas très importante, le plus important c'est le curseur.

    MERCI.

    Voici ma procédure :

    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    CREATE PROCEDURE insert_newid AS
     
    declare @client varchar(255);                       -- Nom du client
    declare @id char(32);                           -- Identifiant génèrer aléatoirement
    declare @id_crea char(32);                          -- Identifiant du créateur
    declare @d datetime;                               -- Date du jour
    declare @id_perm char(32);                        -- Identifiant de la permission
    declare @nl char(1);                            -- NOT_LOCKABLE
    declare @mod char(32) ;                            -- MODIFIED_BY_ID
    declare @mr varchar(8) ;                        -- MAJOR_REV
    declare @cs char(32) ;                            -- CURRENT_STATE
    declare @s varchar(32);                         -- STATE
    declare @mod_on datetime;                        -- MODIFIED_ON
    declare @nv char(1);                            -- NEW_VERSION
    declare @ic char(1);                            -- IS_CURRENT
    declare @g int;                                -- GENERATION
    declare @ir char(1);                             -- IS_RELEASED
    declare d CURSOR FOR SELECT Société FROM PLM_TEST..clients        -- Curseur récupérant tous les nom des clients
     
    BEGIN
        -- Récupérartion de l'identifiant du créateur
        SET @id_crea = (SELECT [id] FROM InnovatorSolutions.innovator.[USER] WHERE [keyed_name]='Innovator Admin')
        -- Date du jour
        SET @d = GetDate();
        -- Récupérartion de l'identifiant de la permission
        SET @id_perm = (SELECT [id] FROM InnovatorSolutions.innovator.[PERMISSION] WHERE [name]='Customer');
        SET @nl='0'; 
        -- Récupérartion de l'identifiant de l'utilisateur 'Innovator Admin'
        SET @mod = (SELECT [id] FROM InnovatorSolutions.innovator.[USER] WHERE [keyed_name]='Innovator Admin')
        SET @mr='A'; 
        -- Récupérartion du 'CURRENT_STATE' du client 'A' pour qu'ils soient tous dans le même état
        SET @cs = (SELECT CURRENT_STATE FROM innovator.CUSTOMER WHERE (NAME = 'A'));
        SET @s='Released'; 
        -- Date courante
        SET @mod_on=GetDate(); 
        SET @nv='1'; 
        SET @ic='1'; 
        SET @g=1; 
        SET @ir='1';
        OPEN d
        FETCH NEXT FROM d INTO @client;
        WHILE @@FETCH_STATUS = 0
        BEGIN
            -- Génération de l'identifiant unique
            SET @id= innovator.item_id(newid());
            -- Insertion des données
            INSERT INTO InnovatorSolutions.innovator.CUSTOMER
            ([NAME], [ID], CREATED_BY_ID, CREATED_ON, PERMISSION_ID, CONFIG_ID,KEYED_NAME,NOT_LOCKABLE, MODIFIED_BY_ID, MAJOR_REV, CURRENT_STATE, 
            STATE, MODIFIED_ON, NEW_VERSION, IS_CURRENT, GENERATION, IS_RELEASED)
            VALUES (@client, @id, @id_crea, @d, @id_perm, @id,@client,@nl, @mod,@mr,@cs,@s,@mod_on,@nv,@ic,@g,@ir);
            -- Passage à l'élément suivant
            FETCH  NEXT FROM d INTO @client;
        END
    END
    -- Fermeture du curseur
    CLOSE d;
    -- Libération de la mémoire du curseur
    DEALLOCATE d;
    GO

  2. #2
    Membre éprouvé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Août 2006
    Messages
    730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 730
    Points : 923
    Points
    923
    Par défaut
    remplace ton insert par un select dans le curseur. je te l'ai fais ci dessous
    et regarde si tu as plusieurs lignes en retour.

    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    CREATE PROCEDURE insert_newid AS
     
    declare @client varchar(255); -- Nom du client
    declare @id char(32); -- Identifiant génèrer aléatoirement
    declare @id_crea char(32); -- Identifiant du créateur
    declare @d datetime; -- Date du jour
    declare @id_perm char(32); -- Identifiant de la permission
    declare @nl char(1); -- NOT_LOCKABLE
    declare @mod char(32) ; -- MODIFIED_BY_ID
    declare @mr varchar(8) ; -- MAJOR_REV
    declare @cs char(32) ; -- CURRENT_STATE
    declare @s varchar(32); -- STATE
    declare @mod_on datetime; -- MODIFIED_ON
    declare @nv char(1); -- NEW_VERSION
    declare @ic char(1); -- IS_CURRENT
    declare @g int; -- GENERATION
    declare @ir char(1); -- IS_RELEASED
    declare d CURSOR FOR SELECT Société FROM PLM_TEST..clients -- Curseur récupérant tous les nom des clients
     
    BEGIN
    -- Récupérartion de l'identifiant du créateur
    SET @id_crea = (SELECT [id] FROM InnovatorSolutions.innovator.[USER] WHERE [keyed_name]='Innovator Admin')
    -- Date du jour
    SET @d = GetDate();
    -- Récupérartion de l'identifiant de la permission
    SET @id_perm = (SELECT [id] FROM InnovatorSolutions.innovator.[PERMISSION] WHERE [name]='Customer');
    SET @nl='0'; 
    -- Récupérartion de l'identifiant de l'utilisateur 'Innovator Admin'
    SET @mod = (SELECT [id] FROM InnovatorSolutions.innovator.[USER] WHERE [keyed_name]='Innovator Admin')
    SET @mr='A'; 
    -- Récupérartion du 'CURRENT_STATE' du client 'A' pour qu'ils soient tous dans le même état
    SET @cs = (SELECT CURRENT_STATE FROM innovator.CUSTOMER WHERE (NAME = 'A'));
    SET @s='Released'; 
    -- Date courante
    SET @mod_on=GetDate(); 
    SET @nv='1'; 
    SET @ic='1'; 
    SET @g=1; 
    SET @ir='1';
    OPEN d
    FETCH NEXT FROM d INTO @client;
    WHILE @@FETCH_STATUS = 0
    BEGIN
    -- Génération de l'identifiant unique
    SET @id= innovator.item_id(newid());
    -- Insertion des données
    /*INSERT INTO InnovatorSolutions.innovator.CUSTOMER
    ([NAME], [ID], CREATED_BY_ID, CREATED_ON, PERMISSION_ID, CONFIG_ID,KEYED_NAME,NOT_LOCKABLE, MODIFIED_BY_ID, MAJOR_REV, CURRENT_STATE, 
    STATE, MODIFIED_ON, NEW_VERSION, IS_CURRENT, GENERATION, IS_RELEASED)
    VALUES (
    */
    SELECT @client, @id, @id_crea, @d, @id_perm, @id,@client,@nl, @mod,@mr,@cs,@s,@mod_on,@nv,@ic,@g,@ir
    /*
    );
    */
    -- Passage à l'élément suivant
    FETCH NEXT FROM d INTO @client;
    END
    END
    -- Fermeture du curseur
    CLOSE d;
    -- Libération de la mémoire du curseur
    DEALLOCATE d;
    GO

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 854
    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 854
    Points : 52 995
    Points
    52 995
    Billets dans le blog
    6
    Par défaut
    Il est idiot de passer par un curseur qui est un objet épouvantablement lent et dangereusement bloquant alors que votre traitement se résume à une seule requête INSERT on ne peut plus simple....

    Commencer par apprendre la langage SQL. Mon site web comme mon livre peuvent vous y aider !

    A +

  4. #4
    Membre régulier
    Homme Profil pro
    Inscrit en
    Novembre 2007
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Japon

    Informations forums :
    Inscription : Novembre 2007
    Messages : 125
    Points : 92
    Points
    92
    Par défaut
    Bonjour,
    au risque de faire flamber le sujet pourquoi tu te fait toujours de la promo?
    déjà ton nick name, tes propos, toujours faire notion à toi, et ta "maitrise" en sql.

    Je trouve ça super que tu aides les pauvres petit débutant comme moi ou autres. mais joue là un peu plus soft, car des fois c'est irritant.
    enfin je dis ça, je dis rien ^^

    bonne journée.

  5. #5
    Candidat au Club
    Inscrit en
    Mars 2008
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Bonjour,

    J'avait déjà fait le select et je l'ai refait, mais même résultat, une seule ligne s'affiche.

    Chose bizarre, j'ai fait une copie de la table avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * INTO customer1 FROM customer WHERE 1=2
    et là ça MARCHE BIZARRE !!!!

    Je remercie sqlpro pour son aide précieuse et sa modestie.

    De plus, ma table customer posède un contrainte d'unicité sur un des champs et quand j'execute plusieurs fois ma procédure, j'ai un message comme quoi il y a une contrainte, normal, mais il ajoute quand même le champs suivant, donc en executant autant fois ma procedure qu'il y a d'enregistrements, je devrait arrier à remplir ma table.

  6. #6
    Membre éprouvé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Août 2006
    Messages
    730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 730
    Points : 923
    Points
    923
    Par défaut
    tu peux essayer

    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
    INSERT INTO InnovatorSolutions.innovator.CUSTOMER
    ([NAME], [ID], CREATED_BY_ID, CREATED_ON, PERMISSION_ID, CONFIG_ID,KEYED_NAME,NOT_LOCKABLE, MODIFIED_BY_ID, MAJOR_REV, CURRENT_STATE, 
    STATE, MODIFIED_ON, NEW_VERSION, IS_CURRENT, GENERATION, IS_RELEASED)
    SELECT 
    cli.Société , -- client, 
    innovator.item_id(newid()) , --as [id], 
    inu.[id], -- id_crea, 
    GetDate(),-- d, 
    per.[id],-- id_perm, 
    NULL,--id,
    cli.Société , -- client, 
    '0', --nl, 
    inu.[id], --mod,
    'MR', --mr,
    cus.CURRENT_STATE, --cs,
    'Released', --s,
    GetDate(), --mod_on,
    '1', --nv,
    '1', --ic,
    1, --g,
    '1'--ir
     FROM PLM_TEST..clients cli
    JOIN InnovatorSolutions.innovator.[USER] inu on inu.[keyed_name]='Innovator Admin' 
    JOIN InnovatorSolutions.innovator.[PERMISSION] per on per.[name]='Customer'
    join innovator.CUSTOMER cus on cus.NAME = 'A'
    attention, pour cause de new_id, j'ai mis null dans MODIFIED_BY_ID.
    comme MODIFIED_BY_ID = CREATED_BY_ID, il te faudra faire un update derrière

    de plus, il faut que les select sur les 3 tables autres que clients ne te retournent qu'un seul enreg.

Discussions similaires

  1. Executer job une seule fois ?
    Par Moostiq dans le forum SQL
    Réponses: 6
    Dernier message: 19/12/2011, 11h51
  2. DBLink utilisable une seule fois dans une session donnée
    Par thatsallfunk dans le forum Administration
    Réponses: 1
    Dernier message: 22/05/2009, 11h01
  3. Réponses: 4
    Dernier message: 06/06/2008, 10h56
  4. Ma requete s'execute qu'une seule fois dans mon curseur
    Par remyescof dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 21/03/2008, 09h03
  5. Mon callback de dessinae ne s'execute qu'une seul fois
    Par pepsidrinker dans le forum GLUT
    Réponses: 4
    Dernier message: 22/11/2007, 16h46

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