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 :

Opération sur lignes d'une table


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Août 2010
    Messages : 277
    Par défaut Opération sur lignes d'une table
    Bonjour,

    Je débute en T-SQL, et j'aimerai savoir s'il est possible de faire des opérations sur les lignes (enregistrements) d'une table a l’intérieur d'une procédure stocké.

    Un peu comme on le fait avec un datareader et une boucle while MonDatareader.read.

    Merci d'avance
    Gilles

  2. #2
    Membre Expert

    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
    Par défaut
    oui. Il existe plusieurs techniques :

    1. les curseurs (à éviter s'il s'agit d'une opération à chaud en heure de production )

    2.
    a) Création de table temporaire (#Tmptable)
    b) Remplissage de la table temporaire
    c) WHILE EXISTS ( SELECT … FROM #Tmptable)
    BEGIN
    SET @ligneAtraiter = SELECT TOP 1 … FROM #Tmptable
    instrustion à exécuter avec @ligneAtraiter
    DROP de la ligne traitée dans la table #Tmptable
    END
    d) DROP de la table #Tmptable à la fin
    Etienne ZINZINDOHOUE
    Billets-Articles

  3. #3
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Août 2010
    Messages : 277
    Par défaut
    Merci beaucoup de ta réponse rapide.
    Super idée de mettre ça dans une table temporaire puis de l'effeuiller.

  4. #4
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    Bonjour,

    En ce qui concerne les curseurs, ils sont tout simplement à éviter, comme je l'ai montré ici.

    SQL est un langage déclaratif et ensembliste, ce qui signifie :

    - que l'on spécifie seulement le résultat que l'on veut obtenir, et pas la façon de l'obtenir. Donc en dehors d'une procédure stockée de maintenance de base de données (c'est-à-dire pas des données elles-mêmes), les curseurs et WHILE sont contre-performants
    - que les moteurs de bases de données relationnelles SQL sont optimisés pour traiter les données dans leur ensemble, et pas tuple par tuple, par exemple. Cherchez R-BAR

    Un peu comme on le fait avec un datareader et une boucle while MonDatareader.read.
    La façon dont on gère les données dans une application n'a rien à voir avec celle d'une base de données relationnelle SQL.

    Enfin copier des données dans TempDB n'est pas une bonne démarche, puisque :

    - d'une part il s'agit de copier des données que l'on a déjà, ce qui va à l'encontre du principe de non-redondance des données
    - d'autre part, lorsqu'on exécute des procédures stockées qui font recours aux tables temporaires ou aux variables de type TABLE en parallèle, se pose tout ou tard un problème de contention au niveau des pages d'allocation dans les fichiers.

    Bref, si vous voulez faire quelque chose de peu-performant et peu robuste, vous ne pouvez pas mieux vous y prendre

    @++

  5. #5
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Août 2010
    Messages : 277
    Par défaut
    Bonjour

    Merci pour ta reponse, je suis bien conscients que ce n'est pas la meilleur facon de faire, mais je n'ai pas vraiment le choix.

    La table dont j'ai besoin doit etre entierement construite sur une procedure stocké et pas par sur un ordi, car elle sera interrogée et modifié par un téléphone sous android. Tu comprend donc que ce n'est pas android qui va me mettre en forme la table puis la renvoyer sur le serveur.

    De plus il faut aussi prendre en considération le fait que nous somme 3 au pire 4 à etre connecté sur la base (et rarement en meme temps), rajoute a ca que la plus grande table contient 2000 champs (ce qui n'est pas énorme) je ne pense pas écrouler le serveur AZURE.

    derniere chose, je compte procéder comme ceci:
    je crée une table temporaire
    j'y met le resultat d'une requete qui devrait contenir moins de 100 enregistrements.
    je passe en revue chaque enregistrement de la table temporaire
    la j'ai un traitement a faire qui doit en fonction de certaine condition me remplir la table final.

    Un exemple simple pour que tu comprennes mieux:
    - 1 table client
    - 1table facture
    - 1table prelevement

    je fais une requete select du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select Nom, Num Facture,  date limite Payement, prelevement from client where facture.payé =0 inner join Factures
    j'obtiens donc un resultat de la sorte

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Nom     Num Facture     date limite Payement       prelevement        
    toto     123456            15/10/2012                    mensuel
    toto     254525            10/11/2012                    mensuel
    titi       444454            12/12/2012                    Cheque
    titi       888888            20/12/2012                    Cheque
    Maintenant pour chaque factures de toto je dois:
    - savoir si on a dépassé la date limite - 5 jours ouvré s'il est au prélèvement
    - regroupé les deux enregistrements toto et titi

    Dans la table finale je veux obtenir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Nom   date limite Payement     Fact1      Fact2      Prelevement      est a jour     date limite d'enregistrement
    toto   15/10/2012              123456     254525       Mensuel          non         08/10/2012   
    titi   12/12/2012              444454     NULL         Cheque           oui         NULL
    Voila grosso modo l'esprit de ce que je veux faire, et je te passe la table relance ou il faut aussi gerer les dates de relance dans le meme esprit.

    Je suis d'accord pour le principe de non redondance des données, seulement dans mon cas les données ne le sont pas toutes (ex je n'ai pris que la date la proche proche).
    De plus le moteur SQL même s'il n'est pas fait pour cela, sera toujours plus rapide qu'un envoie de la totalité des données en 3g puis un traitement par Android.

    Comme je l'ai dit au départ, je suis débutant sous SQL server, je suis donc preneur de toutes les remarques.
    Merci d'avoir eu le courage de lire jusqu'au bout
    Gilles

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

Discussions similaires

  1. Verrou sur ligne d'une table
    Par egelitros dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 24/05/2018, 09h25
  2. [WD14] Double-Clic sur ligne d'une table
    Par WindeveloP dans le forum WinDev
    Réponses: 5
    Dernier message: 26/02/2010, 22h08
  3. Afficher nombre de lignes d'une table située sur une autre feuille
    Par nemone dans le forum Macros et VBA Excel
    Réponses: 16
    Dernier message: 08/12/2006, 16h28
  4. Réponses: 1
    Dernier message: 19/05/2006, 17h33
  5. Réponses: 6
    Dernier message: 21/04/2006, 11h22

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