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 :

Procedures stockée pour calculer X champs pour chaque enregistrement d'une table


Sujet :

Développement SQL Server

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 35
    Points : 31
    Points
    31
    Par défaut Procedures stockée pour calculer X champs pour chaque enregistrement d'une table
    Bonjour,

    J'ai une table dans SQLServer avec 3 champs devant etre calculés et je voudrais creer une procedure s'executant automatiquement toutes les X heures et qui me recalcule ces 3 champs pour tous les enregistrement (a peu pret 36000 enregistrement a l'heure actuelle).

    Premierement, pensez vous que cela est realisable et pas trop lourd, cette procedure ne sera pas executé plus de 1 fois toutes les 24h.

    Deuxiemement, avez vous un exemple ou une procedure s'execute pour tous les enregistrement. En effet dans ma procedure j'ai 1 requete Select qui me trouve la valeurs du 1er champs etant a calculé et ensuite un update pour l'enregistrer.
    J'ai donc une variable ID de ma table mais il faudrait qu'en faites elle puisse passer d'un enregistrement a l'autre car pour l'instant ma procedure fonctionne mais seulement pour 1 enregistrement.

    J'espere que j'ai ete assez clair je debute en transact sql

    Merci d'avance

  2. #2
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2003
    Messages : 733
    Points : 1 668
    Points
    1 668
    Billets dans le blog
    8
    Par défaut
    Oui, il faut transformer votre procédure en une fonction utilisateur, qui retournerait le même Résultat, puis appeler la fonction dans la clause SELECT

    Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT  champ1, champ2, .., dbo.MaFonction(liste du paramètre…)  AS ResulatMaFonction
    FROM MaTable 
      ... ;
    PS : N’oublie pas lors de la transformation de la procédure en une fonction de purger celle-ci de toute fonction système non déterministe Exemple : getdate() , etc.. dont l’utilisation est interdite dans les fonctions.

    A+
    "Une idée mal écrite est une idée fausse !"
    http://hamid-mira.blogspot.com

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 35
    Points : 31
    Points
    31
    Par défaut
    Merci pour ta reponse hmira, en faites j'ai completement edité mon post etant donné que la solution que j'avais envisagé et dont tu m'a donné la reponse ne me semble pas etre viable pour ce que je veux faire finalement =(
    Merci quand meme

  4. #4
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2003
    Messages : 733
    Points : 1 668
    Points
    1 668
    Billets dans le blog
    8
    Par défaut
    Si, je comprends bien, tu as une table nommée par exemple Table1 contenant 3 champs à calculer exemple ChampCalc1, ChampCalc2 et ChampCalc3
    Tu as une procédure nommée par exemple psCalcRecTable1 qui te permet de calculer les champs ChampCalc1, ChampCalc2 et ChampCalc3, mais pour un seul enregistrement, identifié par son ID, de la table Table1
    Si, j’ai bien compris,
    Il faut créer une procédure plus globale appelée par exemple psCalcAllRecTable1 dans laquelle tu parcours, un par un, tous les enregistrements à calculer de la table Table1 et pour chaque enregistrement tu appelle ta procédure déjà existante psCalcRecTable1 en lui passant l’ID de l’enregistrement à calculer.

    Une fois ta procédure psCalcAllRecTable1 finalisée et terminée, tu crée, sous SQL server, une tâche planifiée, nommée par exemple JobCalcAllRecTable1 (planifiée par exemple 1 fois toutes les 24h) et dont la commande T-SQL serait définie comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    EXEC  dbo.psCalcAllRecTable1(...)
    A+
    "Une idée mal écrite est une idée fausse !"
    http://hamid-mira.blogspot.com

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 35
    Points : 31
    Points
    31
    Par défaut
    En tous cas bien joué hmira tu as parfaitement compris la ou je suis bloqué

    Donc tout le deroulement théorique que tu m'a indiqué est parfait et je n'avais d'ailleurs pas pensé a faire une procédure plus globale !

    Mais maintenant au niveau technique auriez vous des exemple pour réaliser cette procédure :
    " Il faut créer une procédure plus globale appelée par exemple psCalcAllRecTable1 dans laquelle tu parcours, un par un, tous les enregistrements à calculer de la table Table1 et pour chaque enregistrement "

    et notamment comment parcourir un par un les enregistrement c'est la que je coince, c'est peut etre tres simple mais je n'arrive pas a piger la chose.

    Merci

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 35
    Points : 31
    Points
    31
    Par défaut
    Je pense que je vais utiliser les curseurs sa me semble pas mal a premiere vu, je vous donnerez des nouvelles sur mon avancement, si vous avez d'autres idées n'hesitez pas a laisser un message.

  7. #7
    Membre émérite

    Homme Profil pro
    Chargé de Développement et d'Analyse de données
    Inscrit en
    Mars 2010
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé de Développement et d'Analyse de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 278
    Points : 2 856
    Points
    2 856
    Par défaut
    évite d'utiliser les curseurs.
    Tu peux trouver comment contourner les curseurs ICI
    A+
    Etienne ZINZINDOHOUE
    Billets-Articles

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 29/04/2015, 14h44
  2. [AC-2007] Requête pour vérifier la présence d'un enregistrement dans une table.
    Par Mat08 dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 22/09/2011, 18h06
  3. Réponses: 16
    Dernier message: 23/08/2010, 16h03
  4. Réponses: 5
    Dernier message: 20/02/2010, 19h36
  5. Réponses: 2
    Dernier message: 04/07/2008, 20h11

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