Création d'un curseur.

Résolu
PascalCmoa Messages postés 239 Date d'inscription mercredi 19 février 2003 Statut Membre Dernière intervention 17 janvier 2013 - 30 sept. 2008 à 15:43
PascalCmoa Messages postés 239 Date d'inscription mercredi 19 février 2003 Statut Membre Dernière intervention 17 janvier 2013 - 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]

2 réponses

crn_c21 Messages postés 302 Date d'inscription samedi 24 janvier 2004 Statut Membre Dernière intervention 4 février 2011
1 oct. 2008 à 08:58
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?
3
PascalCmoa Messages postés 239 Date d'inscription mercredi 19 février 2003 Statut Membre Dernière intervention 17 janvier 2013 5
1 oct. 2008 à 11:29
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]
0
Rejoignez-nous