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 :

utilisation d'un curseur pour un insert


Sujet :

MS SQL Server

  1. #1
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2006
    Messages
    142
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2006
    Messages : 142
    Points : 77
    Points
    77
    Par défaut utilisation d'un curseur pour un insert
    Bonjour,

    Je cherche à copier des données issues d'une table1 vers une table2 sous une condition. Je vous montre le code, c'est plus simple à comprendre...

    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
     
    CREATE PROCEDURE insert_DP_Histolig
    AS
     
    --déclaration des champs à copier
    DECLARE @avoir As bit
    (...)      // contient les autres champs
    DECLARE @remise3 As bigint
     
    DECLARE curseur cursor
    FOR
    	SELECT avoir,(...),remise3 
    	FROM [Base Tampon].dbo.DP_Histolig
    OPEN curseur
    FETCH curseur INTO @avoir,(...),@remise3 
     
    WHILE @@fetch_Status = 0
    BEGIN 
    	INSERT INTO [Base Tampon].dbo.LigneClient(avoir,(...),remise3)
    	VALUES (@avoir,(...),@remise3)
    	FETCH curseur INTO @avoir,(...),@remise3
    END
    CLOSE curseur
    DEALLOCATE curseur
    GO
    Voila. Le problème c'est que ma méthode ne transfère aucune donnée.
    (je précise que j'ai enlevé des conditions sur ma requetes du curseur pour simplifier. Ces condition exprimes la nécéssité d'utilisation d'un curseur)

    Quelqu'un a-t-il une idée ??? (je suis perdu là)

  2. #2
    Expert confirmé
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Points : 4 043
    Points
    4 043
    Par défaut
    Bonjour,

    Tu n'as pas besoin d'un curseur pour ça. Merci de poster un code plus complet pour qu'on puisse t'aider à le faire sans curseur, en appliquant les conditions dont tu parles.

  3. #3
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2006
    Messages
    142
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2006
    Messages : 142
    Points : 77
    Points
    77
    Par défaut
    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
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
     
    CREATE PROCEDURE insert_DP_Histolig
    AS
    DECLARE @DernierMAJ AS datetime
    --date de la dernière mise à jour de la table Ligneclient par la table DP_Histolig
    SELECT @DernierMAJ=MAX(dat_mvt) from [Base Tampon].dbo.LigneClient where origine='DP'
     
    --déclaration des champs à utiliser dans le datawarehouse
    DECLARE @avoir As bit
    DECLARE @marge As real
    DECLARE @dat_cde As datetime
    DECLARE @origine As varchar(2)
    DECLARE @typ_ligne As varchar(2)
    DECLARE @cod_pro As bigint
    DECLARE @dat_mvt As datetime
    DECLARE @sous_type As varchar(2)
    DECLARE @typ_elem As varchar(3)
    DECLARE @quadri_Cde As int
    DECLARE @numSem_Cde As int
    DECLARE @jour_Cde As int
    DECLARE @mois_Cde As int
    DECLARE @annee_Cde As int
    DECLARE @quadri_Fac As int
    DECLARE @numSem_Fac As int
    DECLARE @jour_Fac As int
    DECLARE @mois_Fac As int
    DECLARE @annee_Fac As int
    DECLARE @nom_pro As varchar(35)
    DECLARE @qte As real
    DECLARE @px_vte As real
    DECLARE @remise1 As real
    DECLARE @remise2 As bigint
    DECLARE @groupe As bigint
    DECLARE @famille As bigint
    DECLARE @s_famille As bigint
    DECLARE @px_ach As real
    DECLARE @no_cde As bigint
    DECLARE @dat_liv As datetime
    DECLARE @commerc As varchar(7)
    DECLARE @mt_ht As real
    DECLARE @qte_cde As bigint
    DECLARE @remise3 As bigint
     
    DECLARE curseur cursor
    FOR
    	SELECT avoir,marge,dat_cde,origine,typ_ligne,cod_pro,dat_mvt,sous_type,typ_elem,quadri_Cde,numSem_Cde,jour_Cde,mois_Cde
    	,annee_Cde,quadri_Fac,numSem_Fac,jour_Fac,mois_Fac,annee_Fac,nom_pro,qte
    	,px_vte,remise1,remise2,groupe,famille,s_famille,px_ach,no_cde 
    	,dat_liv,commerc,mt_ht,qte_cde,remise3 
    	FROM [Base Tampon].dbo.DP_Histolig
    	WHERE dat_mvt > @DernierMAJ 
    OPEN curseur
    FETCH curseur INTO @avoir,@marge,@dat_cde,@origine,@typ_ligne,@cod_pro,@dat_mvt,@sous_type,@typ_elem,@quadri_Cde,@numSem_Cde,@jour_Cde,@mois_Cde
    ,@annee_Cde,@quadri_Fac,@numSem_Fac,@jour_Fac,@mois_Fac,@annee_Fac,@nom_pro,@qte
    ,@px_vte,@remise1,@remise2,@groupe,@famille,@s_famille,@px_ach,@no_cde 
    ,@dat_liv,@commerc,@mt_ht,@qte_cde,@remise3 
     
    WHILE @@fetch_Status = 0
    BEGIN 
    	INSERT INTO [Base Tampon].dbo.LigneClient(avoir,marge,dat_cde,origine,typ_ligne,cod_pro,dat_mvt,sous_type,typ_elem,quadri_Cde,numSem_Cde,jour_Cde,mois_Cde
    	,annee_Cde,quadri_Fac,numSem_Fac,jour_Fac,mois_Fac,annee_Fac,nom_pro,qte
    	,px_vte,remise1,remise2,groupe,famille,s_famille,px_ach,no_cde 
    	,dat_liv,commerc,mt_ht,qte_cde,remise3)
    	VALUES (@avoir,@marge,@dat_cde,@origine,@typ_ligne,@cod_pro,@dat_mvt,@sous_type,@typ_elem,@quadri_Cde,@numSem_Cde,@jour_Cde,@mois_Cde
    	,@annee_Cde,@quadri_Fac,@numSem_Fac,@jour_Fac,@mois_Fac,@annee_Fac,@nom_pro,@qte
    	,@px_vte,@remise1,@remise2,@groupe,@famille,@s_famille,@px_ach,@no_cde 
    	,@dat_liv,@commerc,@mt_ht,@qte_cde,@remise3)
     
    	FETCH curseur INTO @avoir,@marge,@dat_cde,@origine,@typ_ligne,@cod_pro,@dat_mvt,@sous_type,@typ_elem,@quadri_Cde,@numSem_Cde,@jour_Cde,@mois_Cde
    	,@annee_Cde,@quadri_Fac,@numSem_Fac,@jour_Fac,@mois_Fac,@annee_Fac,@nom_pro,@qte
    	,@px_vte,@remise1,@remise2,@groupe,@famille,@s_famille,@px_ach,@no_cde 
    	,@dat_liv,@commerc,@mt_ht,@qte_cde,@remise3
    END
    CLOSE curseur
    DEALLOCATE curseur
    GO
    l'objectif de la procédure est de : rajouter dans une table1 les lignes d'une table2 dont la dat_mvt est plus récente que la plus récente des dat_mvt de la table1
    (ou autrement dit : rajouter les lignes de ma table2 à ma table1 qui ne sont pas déjà dans la table1)


    J'avais quelque chose de similaire avant mais je faisais un "delete from les lignes à ne pas ajouter" puis j'ajoutait ma table à l'autre (avec SSIS).
    Cependant là, je dois conserver ma table source (table2) intacte.

  4. #4
    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
    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
     
    DECLARE @DernierMAJ AS datetime
    --date de la dernière mise à jour de la table Ligneclient par la table DP_Histolig
    SELECT @DernierMAJ=MAX(dat_mvt) FROM [Base Tampon].dbo.LigneClient WHERE origine='DP'
     
    INSERT INTO [Base Tampon].dbo.LigneClient(avoir,marge,dat_cde,origine,typ_ligne,cod_pro,dat_mvt,sous_type,typ_elem,quadri_Cde,numSem_Cde,jour_Cde,mois_Cde
    	,annee_Cde,quadri_Fac,numSem_Fac,jour_Fac,mois_Fac,annee_Fac,nom_pro,qte
    	,px_vte,remise1,remise2,groupe,famille,s_famille,px_ach,no_cde 
    	,dat_liv,commerc,mt_ht,qte_cde,remise3)
    SELECT avoir,marge,dat_cde,origine,typ_ligne,cod_pro,dat_mvt,sous_type,typ_elem,quadri_Cde,numSem_Cde,jour_Cde,mois_Cde
    	,annee_Cde,quadri_Fac,numSem_Fac,jour_Fac,mois_Fac,annee_Fac,nom_pro,qte
    	,px_vte,remise1,remise2,groupe,famille,s_famille,px_ach,no_cde 
    	,dat_liv,commerc,mt_ht,qte_cde,remise3 
    	FROM [Base Tampon].dbo.DP_Histolig
    	WHERE dat_mvt > @DernierMAJ

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 850
    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 850
    Points : 52 984
    Points
    52 984
    Billets dans le blog
    6
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    	INSERT INTO [Base Tampon].dbo.LigneClient(avoir,marge,dat_cde,origine,typ_ligne,cod_pro,dat_mvt,sous_type,typ_elem,quadri_Cde,numSem_Cde,jour_Cde,mois_Cde
    	,annee_Cde,quadri_Fac,numSem_Fac,jour_Fac,mois_Fac,annee_Fac,nom_pro,qte
    	,px_vte,remise1,remise2,groupe,famille,s_famille,px_ach,no_cde 
    	,dat_liv,commerc,mt_ht,qte_cde,remise3)
            SELECT avoir,marge,dat_cde,origine,typ_ligne,cod_pro,dat_mvt,sous_type,typ_elem,quadri_Cde,numSem_Cde,jour_Cde,mois_Cde
    	,annee_Cde,quadri_Fac,numSem_Fac,jour_Fac,mois_Fac,annee_Fac,nom_pro,qte
    	,px_vte,remise1,remise2,groupe,famille,s_famille,px_ach,no_cde 
    	,dat_liv,commerc,mt_ht,qte_cde,remise3 
    	FROM [Base Tampon].dbo.DP_Histolig
    	WHERE dat_mvt > (SELECT MAX(dat_mvt) FROM [Base Tampon].dbo.LigneClient WHERE origine='DP')
    Une seule requête suffit...

    A +

  6. #6
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2006
    Messages
    142
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2006
    Messages : 142
    Points : 77
    Points
    77
    Par défaut
    là je crois que je devais pas être attentif quand j'ai vu ça...

    en tout cas merci à vous

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

Discussions similaires

  1. Utilisation d'un curseur pour changer les données
    Par Julien698 dans le forum Langage SQL
    Réponses: 16
    Dernier message: 13/12/2013, 15h57
  2. Utilisation d'un curseur pour lire base SQLite
    Par pierreduguet dans le forum Android
    Réponses: 2
    Dernier message: 09/11/2012, 00h38
  3. [MySQL] Utilisation de la fonction htmlentities pour l'insertion en base
    Par aztec dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 23/08/2011, 19h19
  4. Utilisation d'un Gif pour le curseur
    Par guilopouloos dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 05/11/2008, 13h44
  5. Réponses: 2
    Dernier message: 02/07/2008, 02h26

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