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 :

[2005 Express] un EXEC dans une fonction tabulaire


Sujet :

Développement SQL Server

  1. #1
    Membre extrêmement actif
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Points : 1 434
    Points
    1 434
    Par défaut [2005 Express] un EXEC dans une fonction tabulaire
    Bonjour

    Je crois que j'essai de faire truc bizarre, mais je trouve pas d'autre moyen pour y arriver.

    Je veux faire une fonction tabulaire qui va me retourner une table à deux champs et qui prends deux paramettres en entrée.
    L'un de ces paramettre est une chaine contenant une liste de nombre séparés par des virgules. Dans la requête servant à fabriquer a table cette liste sert dans une clasue IN().

    Voici le script 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
    18
    19
    20
    21
    22
    23
     
    CREATE FUNCTION [dbo].[MEET_TableCritereListeCheck]
    (@IdInfo INT, @Critere VARCHAR(1000))
    RETURNS 
    @tbl TABLE 
    (
    	UserId UNIQUEIDENTIFIER,
    	Valeur VARCHAR(1000)
    )
    AS
    BEGIN
    /*
    DECLARE @IdInfo INT, @Critere VARCHAR(1000)
    SET @IdInfo = 6
    SET @Critere = '1,3,4,5'
    */
    EXEC('INSERT INTO @tbl (UserId, Valeur) 
    SELECT IM.UserId, IM.Valeur_Info
    FROM dbo.SITE_Information_Membre IM
    WHERE IM.Id_Info_Formulaire = ' + @IdInfo + '
    AND IM.Valeur_Info IN(' + @Critere + ')')
    RETURN
    END
    Et voici le message d'erreur qu'il me retourne à la crétation de la fonction
    Utilisation non valide d'un opérateur présentant des effets secondaires ou d'un opérateur dépendant du temps 'EXECUTE STRING' dans une fonction.
    D'abords je ne comprends pas trés le fondement de ce message. Mais surtout, je suis ennuyé car je ne trouve pas le moyen de transmettre la liste de nombre dans la clause IN() par un aute moyen.

    Pouvez vous m'aider ?
    Mon blog de création d'univers : Qualhiryann
    Mon site qui parle de moi www.ozouf.com
    Pour les joueurs de WOW je suis sur Ysondres et mon perso est Ablanore.

  2. #2
    Membre actif
    Inscrit en
    Février 2009
    Messages
    224
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 224
    Points : 269
    Points
    269
    Par défaut
    Bonjour,
    Avez vous essayez d'utiliser sp_executesql?
    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
     
    CREATE FUNCTION [dbo].[MEET_TableCritereListeCheck]
    (@IdInfo INT, @Critere VARCHAR(1000))
    RETURNS 
    @tbl TABLE 
    (
    	UserId UNIQUEIDENTIFIER,
    	Valeur VARCHAR(1000)
    )
    AS
    BEGIN
    /*
    DECLARE @IdInfo INT, @Critere VARCHAR(1000)
    SET @IdInfo = 6
    SET @Critere = '1,3,4,5'
    */
    declare @commande varchar(2000)
    set @commande='INSERT INTO @tbl (UserId, Valeur) SELECT IM.UserId, IM.Valeur_Info FROM dbo.SITE_Information_Membre IM WHERE IM.Id_Info_Formulaire = ' + @IdInfo + 'AND IM.Valeur_Info IN(' + @Critere + ')';
    EXEC sp_executesql @commande
    RETURN
    END

  3. #3
    Membre extrêmement actif
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Points : 1 434
    Points
    1 434
    Par défaut
    Merci pour ton aide.

    Je ne connaisais pas cette procédure.
    Donc, j'ai implémenté ton code et j'ai eu le résultat suivant :
    Commande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM dbo.MEET_TableCritereListeCheck (6,'1,3,4,5')
    Message de retour :
    Seules les fonctions et les procédures étendues peuvent être exécutées à partir d'une fonction.
    Là aussi, je ne comprends pas le fondement de ce message.

    Une autre idée ?
    Mon blog de création d'univers : Qualhiryann
    Mon site qui parle de moi www.ozouf.com
    Pour les joueurs de WOW je suis sur Ysondres et mon perso est Ablanore.

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

    Il est impossible dans toute fonction :

    - D'appeler une procédure stockée, sauf si c'est une procédure stockée étendue
    - D'utiliser la structure de contrôle TRY ... CATCH
    - D'utiliser @@ERROR
    - D'utiliser RAISERROR
    - De retourner plusieurs ensembles de données
    - D'utiliser des fonctions non déterministes comme GETDATE()
    - D'utiliser des tables temporaires (# et ##)
    - D'utiliser du code SQL dynamique
    - D'utiliser une commande SET.

    Ensuite dans votre cas, la variable table @tb1 que vous référencez dans le code SQL dynamique ne fait pas partie du même contexte d'exécution que votre celui de votre fonction, donc cela n'aurait pas fonctionné.

    Vous pouvez utiliser cet article pour découper votre chaîne de caractères et pouvoir la manipuler comme une table, puis effetuer une jointure sur la CTE en remplacement de la clause IN.

    @++

  5. #5
    Membre actif
    Inscrit en
    Février 2009
    Messages
    224
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 224
    Points : 269
    Points
    269
    Par défaut
    Tout à fait d'accord avec toi elsuket. Il est peut être possible de contourner le problème en effectuant la manipulation suivante qui n'est pas optimum car elle converti la valeur numerique en caractères puis cherche cette sous chaine dans la chaine initial --> vraimement pas bon au niveau des performances
    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
     
    CREATE FUNCTION [dbo].[MEET_TableCritereListeCheck]
    (@IdInfo INT, @Critere VARCHAR(1000))
    RETURNS 
    @tbl TABLE 
    (
    	UserId UNIQUEIDENTIFIER,
    	Valeur VARCHAR(1000)
    )
    AS
    BEGIN
    /*
    DECLARE @IdInfo INT, @Critere VARCHAR(1000)
    SET @IdInfo = 6
    SET @Critere = '1,3,4,5'
    */
    INSERT INTO @tbl (UserId, Valeur) 
    	SELECT IM.UserId, IM.Valeur_Info 
    		FROM dbo.SITE_Information_Membre IM 
    		WHERE IM.Id_Info_Formulaire =6 --@IdInfo 
    		AND charindex(rtrim(convert(char,IM.Valeur_Info)),@Critere)>0 ;
     
    RETURN
    END

  6. #6
    Membre extrêmement actif
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Points : 1 434
    Points
    1 434
    Par défaut
    Merci pour votre aide.

    Je viens d'essayer le bout de code de jero44 et ça marche bien, en tout cas ça remonte les données que je souhaite. Maintenant, les perf, ben on verra à l'usage. Au moins, je sais que s'il y a un souci de perf, ça peut venir de là.

    Kenavo
    Mon blog de création d'univers : Qualhiryann
    Mon site qui parle de moi www.ozouf.com
    Pour les joueurs de WOW je suis sur Ysondres et mon perso est Ablanore.

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

Discussions similaires

  1. Comment faire un EXEC dans une fonction
    Par baime dans le forum Développement
    Réponses: 10
    Dernier message: 28/05/2014, 14h04
  2. Réponses: 10
    Dernier message: 15/03/2008, 06h56
  3. Réponses: 5
    Dernier message: 02/10/2006, 19h24
  4. [SQL SERVER 2005] Utilisation de Exec dans une fonction ?
    Par Dadou74 dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 22/09/2006, 22h09
  5. [C# express 2005] Récupération d'information dans une BDD
    Par poussinphp dans le forum Windows Forms
    Réponses: 1
    Dernier message: 06/05/2006, 22h25

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