Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : Création d'un curseur. [ SQL Server, MSDE, SQL Express / Procédures Stockées ] (PascalCmoa)

mardi 30 septembre 2008 à 15:43:47 | Création d'un curseur.

PascalCmoa

Membre Club
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
email: PascalCmoa

mercredi 1 octobre 2008 à 08:58:12 | Re : Création d'un curseur.

crn_c21

Réponse acceptée !
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?




mercredi 1 octobre 2008 à 11:29:55 | Re : Création d'un curseur.

PascalCmoa

Membre Club
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
email: PascalCmoa



Cette discussion est classé dans : classement, curseur, num, tiers, intitule


Répondre à ce message

Sujets en rapport avec ce message

probleme sur une requette sql ! [ par Shadow95 ] Voici le message que j'obtiens après avoir tapper ma requette mais je ne trouve pas où est l'erreur !Quelqu'un peut-il me dire où est l'erreur ?Erreur Requete avec un loop [ par Rouk ] Bonjour, Je dois realiser un script qui recupere les donnees d'une table pour les afficher dans une autre suivant une condition.Exemple :table 1 : num Groupement d'enregistrements [ par dp_favresa ] Bonjour, Je dois récupérer des infos venant de plusieures tables, j'utilise la fonction JOIN, cela fonctionne très bien (code ci-dessous) : < Classement DESC ou ASC de colones [ par christobal ] Bonjour, pour etre + clair quand le visiteur est sur la page des offres il a devant lui un tableau j'aimerais qu'il puisse faire (comme sur d'autre si Problème de select avec un like [ par vincentstryckmans ] Salut, En Delphi  7, j'utilise les composants InterbaseExpress pour communiquer avec Interbase. Une de mes requêtes est du type : select id, num_rel Trigger SQL server [ par Lolo36 ] Bonjour,Je souhaite créer un trigger qui incrémente un compteur.Voici l'algo que je souhaite mettre en place :A la création de la ligneLire dernier N° Sql serveur et Curseur [ par pepe013 ] Bonjour a tous Voila je suis un peu entrain de galéré avec ce curseur sous sql serveur qui me permet de renvoyé tout les attributs d'une table ( nom d Problème Requête SQL et Formulaire [ par Connectol ] Bonjour, J'ai créé un Formulaire '...Accueil' qui dispose d'un Sous-Formulaire '...Accueil2'Sur le Formulaire, il y a une saisie qui lance une requête Incrémentation num_auto qui ne commence pas a "1" [ par MrJAY42 ] MrJAY42Bon je sais que c'est pas un forum SQL mais je fais mon site en php/MYSQLBon alors voila : je fais une table dans laquelle seront stockés des f du MCD au Relation Access ou Mysql... [ par jiojioforever ] Salut ! je suis en stage et je dois gérer une petite bibliotheque (VB+Access) j'ai donc élaboré un MCD et MLD CATEGORIE(num_cat, nom_cat) EDITEUR(num_


Nos sponsors

Sondage...

CalendriCode

Janvier 2009
LMMJVSD
   1234
567891011
12131415161718
19202122232425
262728293031 

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,234 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.