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 :

Concatener resultat d'une fonction dans une chaîne de caractére


Sujet :

Développement SQL Server

  1. #1
    Membre du Club
    Homme Profil pro
    informatique de gestion
    Inscrit en
    Janvier 2011
    Messages
    92
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : informatique de gestion

    Informations forums :
    Inscription : Janvier 2011
    Messages : 92
    Points : 67
    Points
    67
    Par défaut Concatener resultat d'une fonction dans une chaîne de caractére
    Bonjour à tous et à toutes

    je voudrais mettre en place une fonction qui me permet de concaténer les libellés des options dans une chaîne de caractères
    par rapport à un identifiant
    le résultat doit ressembler à ceci

    Options : option1,option2,option n

    j'ai mis en place la fonction qui me retourne la liste des options par rapport à un id donné en paramètre
    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
     
     
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
     
    CREATE PROCEDURE FctLibelleOptionBien
     
    	@idBien int
    AS
    BEGIN
    	-- SET NOCOUNT ON added to prevent extra result sets from
    	-- interfering with SELECT statements.
    	SET NOCOUNT ON;
     
     
    	SELECT libelle from Options O join OptionsBien OB 
    	on o.idOption = ob.idOption
    	where idBien = @idBien
    END
    GO
    mais pour le formater dans le résultat voulu, c'est un casse tête

    Merci

  2. #2
    Membre du Club
    Homme Profil pro
    informatique de gestion
    Inscrit en
    Janvier 2011
    Messages
    92
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : informatique de gestion

    Informations forums :
    Inscription : Janvier 2011
    Messages : 92
    Points : 67
    Points
    67
    Par défaut
    Voici un essai il m'a l'air de fonctionner mais une autre idée et toujours la bienvenue

    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
     
    USE [HomeShareDB]
    GO
    /****** Object:  StoredProcedure [dbo].[FctLibelleOptionBien]    Script Date: 20-08-15 19:11:56 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    ALTER PROCEDURE [dbo].[FctLibelleOptionBien]
    	-- Add the parameters for the stored procedure here
    	@idBien int
    AS
    BEGIN
    	-- SET NOCOUNT ON added to prevent extra result sets from
    	-- interfering with SELECT statements.
    	SET NOCOUNT ON;
     
     
    create  table #table (options nvarchar(500))
     
    DECLARE CR_emp CURSOR FOR 
    	SELECT libelle from Options O join OptionsBien OB 
    		on o.idOption = ob.idOption
    		where idBien = @idbien
     
    DECLARE @optionLibelle nvarchar(500)
     
    open CR_emp
    fetch CR_emp into @optionLibelle
     
    WHILE (@@FETCH_STATUS = 0)
    BEGIN
     
      BEGIN
        INSERT INTO #table VALUES (@optionLibelle)
      END
      FETCH CR_emp INTO @optionLibelle
      END
     
    CLOSE CR_emp
    DEALLOCATE CR_emp
    declare @option varchar(500)
    select @option = coalesce(@option + ', ', '') + options from #table
    select options = @option
     
    drop table #table
    END
    mais je n'arrive pas à afficher

    Options : Option1 etc...
    j'ai un souci dans mon dernier select

  3. #3
    Membre du Club
    Homme Profil pro
    informatique de gestion
    Inscrit en
    Janvier 2011
    Messages
    92
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : informatique de gestion

    Informations forums :
    Inscription : Janvier 2011
    Messages : 92
    Points : 67
    Points
    67
    Par défaut
    Et bien sur je me suis trompé à la place de faire une fonction j'ai fait une procédure

    Dur Dur d'étudier pendant les vacances

  4. #4
    Membre du Club
    Homme Profil pro
    informatique de gestion
    Inscrit en
    Janvier 2011
    Messages
    92
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : informatique de gestion

    Informations forums :
    Inscription : Janvier 2011
    Messages : 92
    Points : 67
    Points
    67
    Par défaut
    Voici ma fonction merci d'avance pour vos lumiéres
    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
     
    -- ================================================
    -- Template generated from Template Explorer using:
    -- Create Scalar Function (New Menu).SQL
    --
    -- Use the Specify Values for Template Parameters 
    -- command (Ctrl-Shift-M) to fill in the parameter 
    -- values below.
    --
    -- This block of comments will not be included in
    -- the definition of the function.
    -- ================================================
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    -- =============================================
    -- Author:		gerard
    -- Create date: 
    -- Description:	
    -- =============================================
    CREATE FUNCTION FctLibelleoption
    (
    	-- Add the parameters for the function here
    	@IdBien int
    )
    RETURNS varchar(500)
    AS
    BEGIN
    	-- Declare the return variable here
    	DECLARE @Result varchar(500)
     
    	-- Add the T-SQL statements to compute the return value here
     
    declare  @table table (options nvarchar(500))
     
    DECLARE CR_emp CURSOR FOR 
    	SELECT libelle from Options O join OptionsBien OB 
    		on o.idOption = ob.idOption
    		where idBien = @idbien
     
    DECLARE @optionLibelle nvarchar(500)
     
    open CR_emp
    fetch CR_emp into @optionLibelle
     
    WHILE (@@FETCH_STATUS = 0)
    BEGIN
     
      BEGIN
        INSERT INTO @table VALUES (@optionLibelle)
      END
      FETCH CR_emp INTO @optionLibelle
      END
     
    CLOSE CR_emp
    DEALLOCATE CR_emp
    --declare @option varchar(500)
    --select @option = coalesce(@option + ', ', '') + options from @table
    --select options = @option
    select @Result = coalesce(@Result + ', ', '') + options from @table
     
     
     
    	-- Return the result of the function
    	RETURN @Result
     
    END
    GO

  5. #5
    Invité
    Invité(e)
    Par défaut
    J'ai deux façons de faire, la première avec du XML et la deuxième en récursive. Voici les exemples :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    -- transfomer en liste
    ; with SR as ( select 850 nom union select 810 union select 856) ,
    SR2 as ( select replace(cast((select nom '*' from SR order by 1 FOR XML PATH('tr'), TYPE) as varchar (max)), '</tr><tr>', ', ' ) ligne)
    select substring( ligne , 5 , len(ligne)-9) from SR2
     
    -- transfomer en liste - II
    declare @liste_id_client varchar(4000)
    set @liste_id_client=''
    SELECT @liste_id_client = @liste_id_client + CASE WHEN len(@liste_id_client)=0 THEN '' ELSE ', ' END + cast(entreprise as varchar(4000))
    from ( select 850 entreprise union select 810 union select 856)  as SR
    order by entreprise
    SELECT @liste_id_client

  6. #6
    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 : 42
    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
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Évitons les curseurs, qui sont contre-performants puisqu'ils traitent un jeu de données ligne par ligne (Row by Agonizing Row ) au lieu de le traiter entièrement, ce pour quoi SQL existe et SQL Server est optimisé. Identiquement, évitez les fonctions scalaires : d'une certaine manière, elles sont exécutées une fois pour chaque ligne du résultat, donc un peu comme un curseur.

    Le seul type de fonction qui est performant (et encore pas dans tous les cas) sont les fonctions de table en ligne, car celles-ci sont effectivement exécutées une seule fois sur l'ensemble du jeu de données. On notera par ailleurs que ce type de fonction apparait dans le plans d'exécution des requêtes, ce qui n'est pas le cas des fonctions scalaires.

    Le deux requêtes-type proposées par 7gyY9w1ZY6ySRgPeaefZ sont bien plus performantes (par expérience).
    Adam Machanic a largement traité ce sujet. Vous pouvez aussi lire ce billet et ce post.

    @++

  7. #7
    Membre du Club
    Homme Profil pro
    informatique de gestion
    Inscrit en
    Janvier 2011
    Messages
    92
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : informatique de gestion

    Informations forums :
    Inscription : Janvier 2011
    Messages : 92
    Points : 67
    Points
    67
    Par défaut
    Merci pour vos réponses

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

Discussions similaires

  1. Appel d'une fonction dans une fonction d'une même classe
    Par script73 dans le forum Général Python
    Réponses: 3
    Dernier message: 06/03/2015, 10h18
  2. portée d'une variable dans une fonction dans une méthode
    Par laurentg2003 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 29/06/2009, 19h05
  3. [POO] dans une classe, appeler une fonction dans une méthode
    Par arnaudperfect dans le forum Langage
    Réponses: 3
    Dernier message: 26/08/2007, 23h04
  4. Réponses: 8
    Dernier message: 10/01/2007, 21h10
  5. [PHP-JS] une fonction dans une fonction
    Par lodan dans le forum Langage
    Réponses: 6
    Dernier message: 25/06/2006, 19h14

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