Création d'un curseur. [Résolu]

PascalCmoa 240 Messages postés mercredi 19 février 2003Date d'inscription 17 janvier 2013 Dernière intervention - 30 sept. 2008 à 15:43 - Dernière réponse : PascalCmoa 240 Messages postés mercredi 19 février 2003Date d'inscription 17 janvier 2013 Dernière intervention
- 1 oct. 2008 à 11:29
Bonjour,

Je suis complètement nouveau dans la création de curseur sous MS SQL Server 2005 (pour cause je bossais sur MySQL 4). Voilà je dois créer un job qui doit me réaliser certaine chose. Dont l'une est de remplir une table d'un serveur SQL A vers une table d'un serveur SQL B. L'insert ne doit se faire que sur les nouveaux enregistrements.

J'ai donc réalisé le script suivant:

-- Déclaration des variables récupérant les données à insérer dans la table TIERS.
DECLARE @TIERS_NUM varchar(17),
        @TIERS_INTITULE varchar(35),
        @TIERS_CLASSEMENT varchar(17)
       
-- Déclaration du curseur
DECLARE curseurTIERS CURSOR FOR
    SELECT
        CT_NUM,
        CT_INTITULE,
        CT_CLASSEMENT
    FROM [SERVER-A].[BASE_A].dbo.F_COMPTET
    where
        CT_TYPE = 0

-- Ouverture du curseur
OPEN curseurTIERS

-- On se place sur le premier enregistrement recupérer par le curseur
FETCH NEXT FROM curseurTIERS INTO @TIERS_NUM, @TIERS_INTITULE, @TIERS_CLASSEMENT

-- Tant que le curseur obtient un ligne d'enregistrement
WHILE @@FETCH_STATUS = 0
BEGIN
    -- On teste si le champ n'est pas connu dans la table
    IF NOT EXISTS (SELECT * FROM [SERVER_B].[BASE_A].dbo.BUD_TIERS WHERE TIERS_NUM = @TIERS_NUM)
    BEGIN
        -- Si il est inconnu de la table, on insert les données.
        INSERT INTO [SERVER_B].[BASE_A].dbo.BUD_TIERS (TIERS_NUM, TIERS_INTITULE, TIERS_CLASSEMENT)
        VALUES(@TIERS_NUM, @TIERS_INTITULE, @TIERS_CLASSEMENT)
        -- On passe à l'enregistrement suivant
        FETCH NEXT FROM curseurTIERS INTO @TIERS_NUM, @TIERS_INTITULE, @TIERS_CLASSEMENT
    END
END

-- Fermeture du curseur
CLOSE curseurTIERS

-- Libération de la mémoire du curseur créé.
DEALLOCATE curseurTIERS

Pour premier test, je n'ai pris que les 3000 premiers enregistrements => OK
Pour le second test, j'ai gardé les 3000 premiers enregistrements, mais je veux ajouter les autres manquant (il y a environ plus de 6000 enregistrements). => Pour moi pas OK car cela prends enormément de temps d'une part, d'autre part les derniers enregistrements n'ont pas été insérer.

J'aimerai donc savoir si j'ai fait une erreur dans la création de mon curseur. Si oui quelle est-elle ?

Merci

PascalCmoa
[mailto:pascal.aknouche@free.fr email: PascalCmoa]
Afficher la suite 

Votre réponse

2 réponses

Meilleure réponse
crn_c21 303 Messages postés samedi 24 janvier 2004Date d'inscription 4 février 2011 Dernière intervention - 1 oct. 2008 à 08:58
3
Merci
Y'a quelque petit truc pour améliorer la vitesse :

au lieu de : IF NOT EXISTS (SELECT * FROM [SERVER_B].[BASE_A].dbo.BUD_TIERS WHERE TIERS_NUM = @TIERS_NUM)

préférer :IF NOT EXISTS (SELECT top 1 1 FROM [SERVER_B].[BASE_A].dbo.BUD_TIERS WHERE TIERS_NUM = @TIERS_NUM)

permet de voir si au moins un enregistrement existe.

Pour le curseur puisqu'il tourne sur le serveur A :
DECLARE curseurTIERS CURSOR LOCAL FAST_FORWARD

FOR     SELECT
            CT_NUM,
            CT_INTITULE,
            CT_CLASSEMENT
            FROM [BASE_A].dbo.F_COMPTET
            where   CT_TYPE = 0
Open curseurTIERS

pour la lecture du curseur
WHILE 1=1
BEGIN
    Fecth Next From curseurTIERSInto ......

    If @@Fetch_Status<>0 Break

    if not exists .....

END
CLOSE curseurTIERS
DEALLOCATE curseurTIERS

Les index sont -ils bien placés?

As-tu penser a la réplication plutot qu'une mise à jour par curseur?

Merci crn_c21 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 72 internautes ce mois-ci

Commenter la réponse de crn_c21
PascalCmoa 240 Messages postés mercredi 19 février 2003Date d'inscription 17 janvier 2013 Dernière intervention - 1 oct. 2008 à 11:29
0
Merci
Merci pour la réponse et les conseils.
Je vais faire ce que tu as écrit. Finalement, c'est le temps mis par mon curseur qui m'a inquiété (pour rien ), par contre je vais utiliser tes conseils pour optimiser le temps de traitement.

Encore merci

PascalCmoa
[mailto:pascal.aknouche@free.fr email: PascalCmoa]
Commenter la réponse de PascalCmoa

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.