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 :

[SQL SERVER 2005] Utilisation de Exec dans une fonction ?


Sujet :

MS SQL Server

  1. #1
    Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 112
    Points : 62
    Points
    62
    Par défaut [SQL SERVER 2005] Utilisation de Exec dans une fonction ?
    Bonjour,

    je chercher à créer une fonction qui me retourne le contenu de la colonne dont le nom est passée en paramètre de la fonction
    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
     CREATE FUNCTION [FN_GET_TERMES](@CODE_TERMES VARCHAR(30),@COLUMN_NAME VARCHAR(10))
    RETURNS VARCHAR(50)
    AS
    BEGIN 
    	DECLARE @TERMES AS VARCHAR(50)
    	DECLARE @sSql AS NVARCHAR(4000)
    	DECLARE @sST AS VARCHAR(5)	
    	SET @sST=''''
     
    	SET @sSql = 'SELECT @TERMES = ' + @COLUMN_NAME + 
    	+ ' FROM TERMES ' +
    	+ ' WHERE CODE_TERMES = ' + @sST + @CODE_TERMES + @sST
     
    	EXECUTE(@sSql)
     
    	RETURN @TERMES
    END
    A la compilation il me dit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Serveur : Msg 443, Niveau  16, État 2, Procédure FN_GET_TERMES, Ligne 20
    Utilisation incorrecte de 'EXECUTE' à l'intérieur d'une fonction.
    N'est ce pas possible d'utiliser EXEC ou EXECUTE dans une fonction ?
    Sinon comment puis-je faire car je voudrais utiliser cette fonction dans mes requêtes de procédure stockées (SELECT FN_GET_TERMES('SG_TOUTES',@COLNAME))
    Merci par avance de votre aide

  2. #2
    Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 112
    Points : 62
    Points
    62
    Par défaut
    Il n'y a vraiment personne qui peut m'aider ?
    Peut-être ne suis-je pas assez claire ?

  3. #3
    Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 112
    Points : 62
    Points
    62
    Par défaut
    Comme je ne m'en sortais pas je me suis dit que j'allais utiliser une procédure stockée qui me retournerait la valeur que je cherche et qui serait ensuite appelée par ma fonction :

    La procédure stockée:
    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
     
    CREATE  PROCEDURE [PS_GET_TERMES](@CODE_TERMES VARCHAR(30),@LANG VARCHAR(10),
    @TERMES AS VARCHAR(50) OUTPUT )
    AS
    BEGIN
        DECLARE @sSql AS NVARCHAR(4000)
        DECLARE @sST AS VARCHAR(5)
        SET @sST=''''
     
        SET @sSql = 'SELECT ' + @LANG +
        + ' FROM TERMES ' +
        + ' WHERE CODE_TERMES = ' + @sST + @CODE_TERMES + @sST
     
        EXEC (@sSql)
     
        RETURN @TERMES
    END
    La fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    CREATE FUNCTION [FN_GET_TERMES](@CODE_TERMES VARCHAR(30),@LANG VARCHAR(10))
    RETURNS VARCHAR(50)
    AS
    BEGIN
        DECLARE @TERMES AS VARCHAR(50)
     
        exec PS_GET_TERMES @CODE_TERMES,@LANG,@TERMES
     
        RETURN @TERMES
    END
    Oui mais voilà maintenant j'ai l'erreur suivante :
    Seules les fonctions et les procédures étendues peuvent être exécutées à partir d'une fonction.

    Comment puis je m'en sortir sachant que je dois utiliser ma fonction dans des champs d'un Select ?

  4. #4
    Expert confirmé
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Points : 4 043
    Points
    4 043
    Par défaut
    Bonjour,

    Tu ne peux pas appeler de procédure stockée non étendue dans une fonction, tu ne peux pas faire de code SQL dynamique dans une fonction. Tu peux peut-être, si tu connais par avance le nom de tes colonnes, utiliser un CASE dans la fonction pour attribuer le valeur de la bonne colonne à ta variable. MAIS, tout ceci risque de te poser de gros problèmes de performances sur ta requête de base : appeler une fonction dans le SELECT peut faire baisser tes performances de beaucoup sur de grosses requêtes.
    Rudi Bruchez
    Rudi Bruchez EIRL, solutions MS SQL Server et NoSQL
    LinkedIn - [Outil libre de diagnostic SQL Server : Sql Trismegiste]
    LIVRES : Optimiser SQL Server -
    Microsoft SQL Server 2012 Security Cookbook
    - les bases de données NoSQL

    e-learning : LinkedIn Learning - Pluralsight

  5. #5
    Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 112
    Points : 62
    Points
    62
    Par défaut
    C'est effectivement la solution que j'ai adopté en attendant d'en avoir peut-être une de meilleure.
    Je sais que ce n'est pas optimum mais je ne peux pas vraiment faire autrement.
    Merci infiniment de ta réponse.

  6. #6
    En attente de confirmation mail
    Inscrit en
    Août 2006
    Messages
    550
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations forums :
    Inscription : Août 2006
    Messages : 550
    Points : 669
    Points
    669
    Par défaut
    Bonjour,

    J'ai rencontré le même problème avec une table qui contient plus de 500 champs, il y a un moment.

    J'ai du adopter la solution du case aussi.

    Si tu trouves une autre solution (en tenant compte de performances, bien sur), je suis preneur.

Discussions similaires

  1. Réponses: 25
    Dernier message: 15/03/2011, 08h41
  2. [2005 Express] un EXEC dans une fonction tabulaire
    Par zooffy dans le forum Développement
    Réponses: 5
    Dernier message: 17/02/2009, 19h04
  3. [Ms SQL server 5.0] gros fichiers dans une table ou sur le DD?
    Par rastamath69 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 10/10/2006, 14h09
  4. [SQL server] Comment Fusionner des données dans une requête
    Par MoTUmBo dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 27/07/2005, 15h24
  5. [SQL Server] Passage d'un paramètre dans une procédure
    Par navis84 dans le forum Bases de données
    Réponses: 3
    Dernier message: 14/01/2005, 13h19

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