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

MS SQL Server Discussion :

Fonction ou procedure


Sujet :

MS SQL Server

  1. #1
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2003
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 188
    Points : 113
    Points
    113
    Par défaut Fonction ou procedure
    Bonjour,

    je suis tout nouveau dans le monde de ms sqlserver.
    Je voudrais faire une procédure ou plutot une fonction, qui me renvoie des données.
    Pour l'instant ca va.
    Par contre, j'ai l'habitude avec Interbase de faire un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    for select(....) INTO :var1 ...
    do
    begin
      If 
         ...
      else
        ...
     
    ...
    suspend;  /* mémorisation de la ligne */
    end
    Je voudrais faire la même chose ici, mais je ne vois pas comment.

    En fait, le but est de parcourir toutes les lignes afin de comparer des valeurs de ces lignes et renvoyer plusieurs valeurs en fonction de (un autre select si une valeur = 0).
    Je voulais le faire avec une vue, mais je ne pense pas qu'une vue accepte des if, donc une fonction semble le seul moyen.

    Merci

  2. #2
    Rédacteur/Modérateur

    Avatar de Fabien Celaia
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2002
    Messages
    4 222
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2002
    Messages : 4 222
    Points : 19 551
    Points
    19 551
    Billets dans le blog
    25
    Par défaut
    Prefere un traitement ensembliste via procedures stockees plutot que des traitements iteratifs via fonctions.

    Pour parcourir ligne a ligne, il te faut utiliser un curseur, mais reflechis bien si tu ne peux pas le faire de maniere plus elegante et performante en ensembliste.

    Pour reprendre ton exemble:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for select(....) INTO :var1 ... 
    do 
    begin 
      If 
         update ... set MaCol=3 
      else 
        update ... set MaCol=5
    ...s'ecrirait de cette maniere en curseur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    DECLARE cursor cur as select ...
    DECLARE @var1...
    open cur
    fetch cur into @var1
     
    while @@sqlstatus <> 2
    BEGIN
    if @var1=...
       BEGIN
         update ... set MaCol=3 
       END
    else
       BEGIN
         update ... set MaCol=5
       END
     
    fetch cur into @var1
    END
    close cur
    deallocate ...
    END
    ... mais serait bien plus efficace en ensembliste

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    update ... set MaCol=5 where cond = n
    update ... set MaCol=5 where cond <> n
    Sr DBA Oracle / MS-SQL / MySQL / Postgresql / SAP-Sybase / Informix / DB2

    N'oublie pas de consulter mes articles, mon blog, les cours et les FAQ SGBD

    Attention : pas de réponse technique par MP : pensez aux autres, passez par les forums !

  3. #3
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2003
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 188
    Points : 113
    Points
    113
    Par défaut
    Merci beaucoup.
    Je vais d'abord faire comme j'avais prévu, car c'est assez urgent.
    Par contre, l'assembliste, je ne connais pas, mais je pense qu'il va falloir que je m'y penche.

    Merci encore

  4. #4
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2003
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 188
    Points : 113
    Points
    113
    Par défaut
    J'ai lu un peu le code assembliste que tu m'a donné.
    Par contre est ce que je peux faire :
    dans mon select j'ai M1, M2 et M3 (3 montant)

    si M1 = 0 alors M1 = M3-M2
    ( Si M1 <> 0 alors M1 = M1 )
    je fais ca car dans le select il y a 3 join.

    De plus
    Quand tu mets :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    fetch cur into @var1
    ca fait quoi exactement ?
    Moi, dans var1, j'avais M1
    var2, j'avais M2
    ...
    et a la fin, je retournais M1 avec mes autres variables (grace a suspend)
    La déclaration se fesait comme ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    CREATE PROCEDURE BilanAnalyse
    returns (NMAFFR VARCHAR(6),
             IDCMDI INTEGER,LBCOUR VARCHAR(10), CAT VARCHAR(20),
             ACHATS FLOAT,BUDGET FLOAT,HEURES FLOAT,
             COUTCI FLOAT,MargeB FLOAT,
             ETATCI VARCHAR(50),
             DTEDEB DATE, DTEFIN DATE, DTEFAC DATE)
    AS
    et des que j'écrivais SUSPEND, toutes les variables étaient retournées.

  5. #5
    Rédacteur/Modérateur

    Avatar de Fabien Celaia
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2002
    Messages
    4 222
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2002
    Messages : 4 222
    Points : 19 551
    Points
    19 551
    Billets dans le blog
    25
    Par défaut
    L'ensembliste, tu connais sans le savoir si tu fais du SQL: on traite des ensembles d'enregistrements plutot que des enregistrements ligne par ligne.

    si M1 = 0 alors M1 = M3-M2
    donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT case M1 when 0 then M3-M2 else M1 end
    FROM ...

    Le Fetch attribue a la variable @v1 la ligne courrente sur curseur
    Si ton select retournait 2 enregistrements:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fetch cur into @v1, @v2
    En T-SQL, si tu veux retourner plusieurs variables, tu dois les passer en parametre en y specifiant OUTPUT

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    CREATE PROCEDURE BilanAnalyse 
    (NMAFFR VARCHAR(6) OUTPUT, 
    IDCMDI INTEGER OUTPUT,
    LBCOUR VARCHAR(10) OUTPUT, 
    CAT VARCHAR(20) OUTPUT, 
    ACHATS FLOAT OUTPUT,
    BUDGET FLOAT OUTPUT,
    HEURES FLOAT OUTPUT, 
    COUTCI FLOAT,MargeB FLOAT OUTPUT, 
    ETATCI VARCHAR(50) OUTPUT, 
    DTEDEB DATE OUTPUT, 
    DTEFIN DATE OUTPUT, 
    DTEFAC DATE OUTPUT) 
    AS
    ... mais je suppose que dans cet exemple, seules quelques variables doivent etre retournees, l majeure partie servant de conditions
    Sr DBA Oracle / MS-SQL / MySQL / Postgresql / SAP-Sybase / Informix / DB2

    N'oublie pas de consulter mes articles, mon blog, les cours et les FAQ SGBD

    Attention : pas de réponse technique par MP : pensez aux autres, passez par les forums !

  6. #6
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2003
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 188
    Points : 113
    Points
    113
    Par défaut
    Merci !
    Je vais essayer de me débrouiller avec tout ca.
    je pense avoir compris (ou au moins l'essentiel).

    MERCIIIIIIII

  7. #7
    Rédacteur
    Avatar de WOLO Laurent
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Mars 2003
    Messages
    2 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Congo-Brazzaville

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 741
    Points : 4 414
    Points
    4 414
    Par défaut
    Alors marque resolu ton poste.

    Découvrez la FAQ de MS SQL Server.
    La chance accorde ses faveurs aux esprits avertis !

  8. #8
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2003
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 188
    Points : 113
    Points
    113
    Par défaut
    Désolé, j'oubliera plus, promis

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

Discussions similaires

  1. Lister toutes les fonctions ou procedure
    Par ronan_c dans le forum Oracle
    Réponses: 6
    Dernier message: 21/07/2006, 14h07
  2. Probleme fonction dans procedure
    Par Kahiba dans le forum Langage
    Réponses: 4
    Dernier message: 24/04/2006, 00h41
  3. Comment declarer une fonction ou procedure globale
    Par manubrard dans le forum Langage
    Réponses: 8
    Dernier message: 21/02/2006, 14h21
  4. fonctions curseur procedure
    Par abdel54 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 27/11/2005, 10h54
  5. Fonction et procedure
    Par rene_baccardi dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 25/09/2005, 16h08

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