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 :

Faire une fonction sql


Sujet :

Développement SQL Server

  1. #1
    Membre éprouvé Avatar de mikoukoumi
    Homme Profil pro
    Développeur .net
    Inscrit en
    Mai 2010
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur .net
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 151
    Par défaut Faire une fonction sql
    Bonjour,
    j'aimerais créer une fonction sql en langage csharp(c#) qui récupère le contenu d'une colonne( qte en commande) à partir d'une autre colonne (identifiant article).

    j'ai cherché comment se faisait les fonctions mais je n'est trouvé grand chose donc si quelqu'un pourrait m'orienter ce serais très gentil de ca part(lien ou conseil).

    ps: désolé si je me suis trompé d'emplacement de sujet

  2. #2
    Expert confirmé
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Par défaut
    Bonjour,

    j'aimerais créer une fonction sql en langage csharp(c#) qui récupère le contenu d'une colonne( qte en commande) à partir d'une autre colonne (identifiant article).
    Quel est l'intérêt de passer par du code .NET pour une telle fonction ?

    ++

  3. #3
    Membre éprouvé Avatar de mikoukoumi
    Homme Profil pro
    Développeur .net
    Inscrit en
    Mai 2010
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur .net
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 151
    Par défaut
    ^^
    Je suis en stage en entreprise, ceci me sert car je récupère toute mes données depuis un sql serveur.
    cela fais déjà assez de temps que je galère je trouve vraiment rien...

  4. #4
    Expert confirmé
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Par défaut
    Ah si vous êtes en stage ...

    Mais pour bien comprendre ...

    Vous voulez créer une méthode en C# qui récupère vos données ou vous voulez faire une fonction SQL en code C# que vous déployerez en assemblies sur le serveur SQL ?

    ++

  5. #5
    Membre éprouvé Avatar de mikoukoumi
    Homme Profil pro
    Développeur .net
    Inscrit en
    Mai 2010
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur .net
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 151
    Par défaut
    oui en stage ^^' c'est bien mais c'est encore mieux quand ca fonctionne

    voici mon code
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data.SqlClient;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    namespace Csharpview
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                try
                {
                    // Chaîne de connexion
                    string strConnect = "database=Madatabase;server=monserveur;User ID=xx;pwd=xx";
    
                    // Objet sql de connection (chaîne)
                    SqlConnection connection = new SqlConnection(strConnect);
    
                    // Ouverture de la connexion sql serveur
                    connection.Open();
    
                    // Créer une requête sql 
                    string strCommand = "SELECT DISTINCT A.Article, A.Code, A.Designation,0 AS Qte FROM dbo.Articles AS A ";
                    //SELECT Articles.Code, Articles.Designation,0 as Qte FROM Articles CROSS JOIN LignesAchatCommande CROSS JOIN AchatCommandes AS ref
    
                    //Créer un DataTable
                     DataTable dataTable= new DataTable();
    
                    //Créer un DataAdapter
                    SqlDataAdapter dataAdapter = new SqlDataAdapter(strCommand, strConnect);
    
    
                    //Remplis(fill) le DataTable avec le DataAdapter
                    dataAdapter.Fill(dataTable);
    
                    //remplir le datagridview avec un dataset
                    dataGridView1.DataSource = dataTable;
    
                    //Fermeture de la connexion sql serveur
                    connection.Close();
                    
                      
                   for (int i = 0; i < dataTable.Rows.Count ; i++) // boucle for qui permet de parcourir la table
                   {
                       string s = "SELECT (LAC.Quantite-LAC.Qtelivree) as Qte FROM LignesAchatCommande AS LAC INNER JOIN AchatCommandes as AC ON LAC.AchatCommande = AC.AchatCommande WHERE AC.Soldee = 0 and LAC.Article = " + dataTable.Rows[i]["Article"].ToString() ;
                       SqlCommand cmd = connection.CreateCommand();
                       cmd.CommandText = s;
                     
                       //Permet de parcourir les lignes du tableau de la colone désirer ici Qte
                       dataTable.Rows[i]["Qte"]=cmd.ExecuteScalar();  
                }         
    			} 
                 catch (Exception ex)
                {
                 System.Diagnostics.Debug.WriteLine(ex.ToString());
                 }
                 }
            }
    }
    j'aimerais une fonction qui récupère les données de Qte (surligné en rouge dans le code) avec une condition

  6. #6
    Membre éclairé Avatar de SetaSensei
    Homme Profil pro
    Inscrit en
    Juin 2006
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 78
    Par défaut
    Eh bien ta requête ne me semble pas fausse...
    Qu'y a-t-il qui ne marche pas ?

    En faire une fonction n'améliorera pas le temps de traitement.
    Par contre, il serait préférable de faire une seule requête pour récupérer la quantité que tu calcules (une requête par ligne, ça fait vite beaucoup !)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT DISTINCT 
    	A.Article, 
    	A.Code, 
    	A.Designation,
    	LAC.Quantite-LAC.Qtelivree as Qte
    FROM 
    	dbo.Articles AS A inner join
    	LignesAchatCommande AS LAC on LAC.Article = A.Article inner join
    	AchatCommandes as AC ON LAC.AchatCommande = AC.AchatCommande 
    WHERE
    	AC.Soldee = 0

    EDIT : La requête en un peu mieux...

  7. #7
    Membre éprouvé Avatar de mikoukoumi
    Homme Profil pro
    Développeur .net
    Inscrit en
    Mai 2010
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur .net
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 151
    Par défaut
    Merci je vais voir si mes tuteurs de stage aiment ce genre écriture.
    Mon but 1er est d'essayer de refaire le code en optimisant les requêtes pour que sa prenne moins de temps que eux.
    tout marche, il me faudrait des piste pour faire une fonctions qui récupère des données de ma colonne Qte

  8. #8
    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,

    Merci je vais voir si mes tuteurs de stage aiment ce genre écriture.
    La syntaxe que vous a proposé SetaSensei est la même que celle que je vous ai donné hier; comme quoi je ne suis pas tout seul
    Cette syntaxe est à la norme, donc si elle ne leur plaît pas ... chapeau


    Mon but 1er est d'essayer de refaire le code en optimisant les requêtes pour que sa prenne moins de temps que eux.
    La requête que je vous ai donné, comme celle de SetaSensei est de très loin bien plus rapide que les itérations au travers desquelles vous passez ou des CROSS JOIN que vous avez écrit.
    Il reste qu'elle peut être encore plus rapide, si, comme je vous l'ai dit, les colonnes qui participent à la jointure sont indexées.

    tout marche, il me faudrait des piste pour faire une fonctions qui récupère des données de ma colonne Qte
    Cela ne présente aucun intérêt, ni intellectuel, ni en terme de performances.

    @++

  9. #9
    Membre éprouvé Avatar de mikoukoumi
    Homme Profil pro
    Développeur .net
    Inscrit en
    Mai 2010
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur .net
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 151
    Par défaut
    Citation Envoyé par elsuket Voir le message
    Cela ne présente aucun intérêt, ni intellectuel, ni en terme de performances.
    moi je ne fais que se qu'on mon tuteur de stage me demande et c'est se qu'il veut je n'y peut rien sa fais 1 semaine que j'ai commencer le c# c'est déjà assez dure je demande juste une piste un tutoriel sur les fonctions sql ou une aide que vous avais déjà donné pour sa même genre de cas , je ne sais ni comment cela ce forme ni comment sa marche.
    Je ne veux pas ca tout cru, j'aimerais comprendre.

  10. #10
    Expert confirmé
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Par défaut
    Voici la documentation en ligne qui vous permettra de comprendre comment faire une fonction SQL

    Cependant comme le dit Elsuket, cela ne vous apportera rien de faire une fonction de votre cas. Comme vous le dites si bien :

    Mon but 1er est d'essayer de refaire le code en optimisant les requêtes pour que sa prenne moins de temps que eux.
    Dans ce cas là une fonction ne vous permettra en rien d'optimiser votre code et encore moins en terme de temps de réponse.

    ++

  11. #11
    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
    Mikoukoumi,

    Je comprends que votre maître de stage vous demande d'écrire des requêtes plus performantes.
    Mais comme je vous l'ai dit, il est clair qu'écrire une requête sera forcément plus rapide que d'écrire une fonction d'assembly pour faire la même chose.

    Les assemblies ne sont pas un remplaçant à T-SQL.
    Elles permettent simplement d'ajouter une richesse fonctionnelle à SQL Server, comme par exemple la lecture de fichiers, la recherche de polygones dans des images, ...

    Il reste que SQL est un langage dont les implémentations fournissent, et de très loin, l'accès le plus rapide aux données.

    @++

  12. #12
    Membre éclairé Avatar de SetaSensei
    Homme Profil pro
    Inscrit en
    Juin 2006
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 78
    Par défaut
    Citation Envoyé par mikoukoumi Voir le message
    moi je ne fais que se qu'on mon tuteur de stage me demande et c'est se qu'il veut je n'y peut rien sa fais 1 semaine que j'ai commencer le c# c'est déjà assez dure je demande juste une piste un tutoriel sur les fonctions sql ou une aide que vous avais déjà donné pour sa même genre de cas , je ne sais ni comment cela ce forme ni comment sa marche.
    Je ne veux pas ca tout cru, j'aimerais comprendre.
    Pour faire très simple sur la question d'une fonction SQL pour ce que tu veux récupérer :
    Une requête SQL est basée sur une logique ensembliste (les "patates" comme aime dire monsieur SqlPro en formation ). Lorsque tu écris une requête simple (celle que nous te proposons), il travaille avec des ensembles de données, les agrèges et renvoie l'ensemble.

    Bon, voilà pour la première explication.
    Maintenant, les fonctions : elles ont certes une utilité, mais dans des cas très précis, quand tu n'as la possibilité de récupérer directement la valeur que tu cherches de manière ensembliste (qui est le fonctionnement optimisé d'une base de données, on ne le dira jamais assez).
    Lorsque tu mets une fonction dans ton select, type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT DISTINCT 
    	A.Article, 
    	A.Code, 
    	A.Designation,
    	dbo.fnRechercherQuantite(Article) AS Qte
    FROM 
    	dbo.Articles AS A INNER JOIN
    	LignesAchatCommande AS LAC ON LAC.Article = A.Article INNER JOIN
    	AchatCommandes AS AC ON LAC.AchatCommande = AC.AchatCommande 
    WHERE
    	AC.Soldee = 0
    Là, le moteur SQL va réaliser la requête et pour chaque ligne exécuter ta fonction. Il va donc marcher en mode itératif, ce qu'il n'est pas sensé faire et impliquera invariablement une perte de performances face à la manière que nous t'avons proposé.

    A titre d'exemple, un avion peut rouler, comme une voiture. Mais il n'a pas été conçu pour ça, du coup il le fait moins bien (utilise plus de carburant, ne peut pas emprunter toutes les routes etc.).
    Voilà pour la version light de l'explication du pourquoi du comment une fonction est une mauvaise idée, voire TRÈS mauvaise dans le cas d'un nombre d'enregistrements élevé.


    EDIT :
    En relisant ton code, j'avais oublié que tu voulais les traiter apparemment à postériori de ta requête, le problème est le même (voire pire). Je m'explique :
    lancer une requête par ligne revient au premier inconvénient que je t'ai présenté. Au lieu de travailler avec un ensemble de données, tu vas travailler avec une donnée à la fois, le temps cumulé de calcul sera de toutes façons plus long que si tu récupérais directement le résultat dans ta première requête.
    En plus, avec un fonctionnement "Je lance une requête par ligne depuis mon client" (ton code au lieu de client si tu préfères) tu perds encore plus de temps ! Tu as le transport de données en plus.
    Pas convaincu ? Imagines que tu aies 100ms de transport par requête. Alors oui, si tu as 5 articles, 500ms c'est quasiment invisible à l'oeil nu. Maintenant tu as 5000 articles ... Et oui d'un coup ça fait un paquet ! Alors que tu as la possibilité d'optimiser ton temps de réponse en faisant le tout une fois pour toutes !

  13. #13
    Membre éprouvé Avatar de mikoukoumi
    Homme Profil pro
    Développeur .net
    Inscrit en
    Mai 2010
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur .net
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 151
    Par défaut
    Merci à vous pour toutes de vos réponses
    Bien que je suis d'accord avec vous pour le temps de réponse d'une fonction par rapport à celle d'une simple requête, le but est de me faire manipuler les fonctions sql .
    C'est une fonction définies par l'utilisateur que je doit faire.
    Je posterais mon code si ca intéresse du monde ^^

    je suis passé a un autre projet avec silverligth donc je suis en pose sur les fonction sql

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 06/03/2008, 15h26
  2. Faire une fonction
    Par philippef dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 12/04/2006, 18h14
  3. soucis a faire une requete SQL
    Par navona dans le forum Langage SQL
    Réponses: 7
    Dernier message: 01/09/2005, 17h19
  4. Réponses: 2
    Dernier message: 03/05/2004, 13h13
  5. [VB6] Comment faire une fonction qui renvoie 2 résultats
    Par tazarine dans le forum VB 6 et antérieur
    Réponses: 10
    Dernier message: 15/01/2004, 01h13

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