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 :

Création d'une fonction


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    829
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 829
    Par défaut Création d'une fonction
    Bonjour à tous,

    je voudrais créer une fonction sur une base bdd sqlserver, mais je débute.

    ci-dessous la fonction que j'ai commencé à creer (non testé) je voudrais savoir si j'ai des erreurs dans la conception, des éléments que j'ai oublié

    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
     
    CREATE FUNCTION departement_concession(@Separateur char(1), @id_concession char(3))
    BEGIN
     
     
    DECLARE  departement CURSOR FOR
       SELECT code_departement FROM concession_to_departement WHERE id_concession= @id_concession
       OPEN departement 
       SET @Resultat = ''   
       FETCH NEXT FROM departement  INTO @code_departement
       WHILE @@FETCH_STATUS = 0    
         BEGIN
    			SET @Resultat =  LTRIM( RTRIM(@code_departement))+ ' ' + rtrim(@Separateur )
     
         FETCH NEXT FROM departement   INTO @code_departement
         END
       CLOSE departement   
       DEALLOCATE departement   
       RETURN @Resultat
    END

    Merci d'avance pour vos conseils

    guigui69

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 22 009
    Billets dans le blog
    6
    Par défaut
    Erreurs :
    • Il manque la déclaration de la variable @resultat en tant que variable de retour
    • Il manque la déclaration de la variable @code_departement en tant que variable dans le traitement
    • Vous utilisez le séparateur "caractères blanc," alors que vous aviez prévu un séparateur @Separateur en argument de votre fonction



    Conseils :
    mettez un "point-virgule" à la fin de chaque commande
    Vous pouvez faire cette opération d'autres manières :
    1) avec un SELECT de concaténation
    2) avec la fonction TRING_AGG
    L'ouverture d'un curseur comme vous l'avez fait, n'est pas la meilleure option. Il existe plusieurs paramètres pour minimiser les ressources :
    https://docs.microsoft.com/fr-fr/sql...l-server-ver15
    Notamment je vous conseillerais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    DECLARE departement CURSOR
       LOCAL FORWARD_ONLY STATIC READ_ONLY
       FOR
          SELECT code_departement 
          FROM concession_to_departement 
          WHERE id_concession= @id_concession;
    Indentez votre code !

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    829
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 829
    Par défaut
    Bonjour SQLpro,

    merci pour vos réponses je ne connaissais pas string_agg.

    voici l'élément mise à jour, suite a vos retours:

    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
     
    CREATE FUNCTION departement_concession(@Separateur char(1), @id_concession char(3))
    BEGIN
      DECLARE  @Resultat char(64)
     
    		DECLARE  departement CURSOR
    			LOCAL FORWARD_ONLY STATIC READ_ONLY
    				FOR
     
    				SELECT STRING_AGG (code_departement,';') 
    				FROM concession_to_departement 
    				WHERE id_concession= @id_concession;
    		OPEN departement 
    			SET @Resultat = ''   
    			SET @code_departement = ''  
    		FETCH NEXT FROM departement  INTO @code_departement
    			WHILE @@FETCH_STATUS = 0    
    				BEGIN
    				SET @Resultat =  LTRIM( RTRIM(@code_departement)) + rtrim(@Separateur )
     
    				FETCH NEXT FROM departement   INTO @code_departement
    				END
    		CLOSE departement   
    		DEALLOCATE departement   
       RETURN @Resultat
    END
    Est-ce que cela vous parait bon, optimisé?

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 22 009
    Billets dans le blog
    6
    Par défaut
    Non.. pas optimisé du tout....

    Voici comment faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE FUNCTION departement_concession(@Separateur char(1), @id_concession char(3))
    RETURNS @Resultat varchar(max)
    BEGIN
       SELECT @Resultat = STRING_AGG(code_departement, @Separateur) 
    	FROM   concession_to_departement 
       WHERE  id_concession= @id_concession;
       RETURN @Resultat;
    END
    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

Discussions similaires

  1. Réponses: 4
    Dernier message: 21/03/2011, 12h54
  2. Problème pour la création d'une fonction
    Par jipé95 dans le forum C
    Réponses: 5
    Dernier message: 10/12/2006, 15h28
  3. Réponses: 16
    Dernier message: 24/10/2006, 22h37
  4. Création d'une fonction sans paramètre?
    Par falcon dans le forum Oracle
    Réponses: 3
    Dernier message: 13/12/2004, 12h32
  5. Réponses: 14
    Dernier message: 09/04/2004, 14h44

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