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 :

[SQL2K] User defined function


Sujet :

MS SQL Server

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 47
    Points : 41
    Points
    41
    Par défaut [SQL2K] User defined function
    Bonjour,

    J'ai une fonction scalaire (FA) qui renvoie un varchar(255). Cette fonction renvoie une requête SQL créée en dynamique. Cette requête se présente ainsi :
    'SELECT Champ1, Champ2 + Champ3 - Champ4 FROM TABLE'

    Ensuite j'ai créé une 2nde fonction (FB), qui appelle la 1ere, et qui est censée renvoyer une table basée sur la requête fournie par (FA).
    Au final, lorsque j'exécute (FB), je n'ai aucun retour de ligne(évidement, j'ai bien vérifié que j'avais des lignes à renvoyer)

    Merci de votre aide !

    Voici les 2 fonctions (en raccourcis...)

    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
     
     
    CREATE function FA() 
    RETURNS varchar(255)
    as
    BEGIN 
     
    ...
                Set @ReqSQL = 'Champ2 + Champ3 - Champ4'
                Set @ReqSQL1 = 'SELECT Champ1, ' + @ReqSQL+ ' AS S1 FROM  B_Stock_Cumul'
     
        RETURN @ReqSQL1
    END
     
     
     
    CREATE function FB() 
    RETURNS @InfoStock TABLE
       (
        Article_ID int,
        S1 int
       )
    as
    BEGIN 
     
    Declare @ReqSQL varchar(255)
     
            Set @ReqSQL = dbo.FA()
     
        RETURN
    END

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 356
    Points : 406
    Points
    406
    Par défaut
    Pour information, le type TABLE n'existe pas dans SQL Server 2000, on ne peut donc pas renvoyer de TABLE dans une fonction.
    Pour ce que tu souhaites faire, je pense que la création d'une vue serait plus adapter.

  3. #3
    Membre actif Avatar de Cpas2latarte
    Inscrit en
    Janvier 2006
    Messages
    237
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 237
    Points : 255
    Points
    255
    Par défaut
    Pour information, le type TABLE n'existe pas dans SQL Server 2000
    Cette information est erroné !

    Il est tout a fait possible de créer une fonction qui retourne une table en SQL SERVER 2000

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 47
    Points : 41
    Points
    41
    Par défaut
    J'ai des fonctions qui me retournent des tables (??), certes ça ne créé pas de table physique, mais le type de retour pour de telle fonction est bien 'TABLE'.
    Je les appellent dans des vues du style :
    SELECT * FROM FA
    Et ça fonctionne très bien.

    Bref, je n'ai surement pas compris ce que tu veux me dire...

    Par contre, je suis obligé de passer par une fonction car dans ma première fonction, je vais lire des tables de paramétrage, et grâce à ceux-ci, je peux créer ma formule pour mon second champ. Donc pas possible avec une simple vue.

    Entre temps, j'ai appelé ma fonction FA à partir d'une procédure stockée, et là ça fonctionne. Donc, je pense que mon problème viens de ma façon d'exécuter et de retourner ma requête. Si quelqu'un voit mon erreur...

    Merci

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 356
    Points : 406
    Points
    406
    Par défaut
    Citation Envoyé par Cpas2latarte Voir le message
    Cette information est erroné !

    Il est tout a fait possible de créer une fonction qui retourne une table en SQL SERVER 2000
    Je ne savais pas. Merci pour l'info en tous cas.
    Je pense qu'il te faut exécuter ta requête dans ta fonction FB.

    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
     
    CREATE FUNCTION FB() 
    RETURNS @InfoStock TABLE
       (
        Article_ID int,
        S1 int
       )
    AS
    BEGIN 
     
    Declare @ReqSQL varchar(255)
     
            SET @ReqSQL = dbo.FA()
     
        RETURN EXECUTE(@ReqSQL) 
    END

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 47
    Points : 41
    Points
    41
    Par défaut
    J'avais déjà essayer !

    ça marche pas non plus.

    La syntaxe n'est pas bonne, une fonction doit se terminer par RETURN (message sql server 2000).

  7. #7
    Membre actif Avatar de Cpas2latarte
    Inscrit en
    Janvier 2006
    Messages
    237
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 237
    Points : 255
    Points
    255
    Par défaut
    en sql server, les fonction sont relativement "pauvre".
    Par exemple, on ne peut pas utiliser le SQL dynamique.

    Ce que tu peux eventulement faire pour contourner cette limitation
    c'est de passer par une proc stoké

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 47
    Points : 41
    Points
    41
    Par défaut
    En effet, avec la solution de la procédure stockée, je retrouve mes lignes. Cependant, mon but étant la création d'une vue, ça ne suffit pas...

    C'est donc impossible dans une fonction d'exécuter une requête SQL contenue dans une variable ?

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 356
    Points : 406
    Points
    406
    Par défaut
    Si la partie variable de ta requête est toujours la même tu peux créer directement ta vue.
    Par contre, si elle est variable je te conseillerai de créer ta vue dynamiquement dans une procédure stockée.
    Exemple

    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 PROCEDURE MaProc
    @nomVue
    AS
    DECLARE @query varchar(1000)
    DECLARE @vue varchar(2000)
     
    SET @query= 'SELECT .... FROM ...'
    --Test de l'existence de la vue
    --Si existe 
    SET @vue='ALTER VIEW '+@nomVue+' AS '+@query
    EXECUTE(@query)
    IF @@ERROR <> 0
                RETURN -1
    --Sinon
    SET @vue='CREATE VIEW '+@nomVue+' AS '+@query
    EXECUTE(@query)
    IF @@ERROR <> 0
                RETURN -1
    GO

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 47
    Points : 41
    Points
    41
    Par défaut
    Très bonne idée !

    Je vais faire partir sur cette piste.

    Merci bcp.

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

Discussions similaires

  1. Comment retourner une table par UDF (user-defined function) ?
    Par brpat dans le forum SQL Procédural
    Réponses: 0
    Dernier message: 07/10/2009, 11h32
  2. [VB]user defined type undefined???
    Par Empty_body dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 13/02/2006, 14h36
  3. User Defined Function (UDF)
    Par mondelphi dans le forum SQL
    Réponses: 3
    Dernier message: 22/04/2005, 10h22
  4. INSO Filter : "USER-defined exception" avec ctx_do
    Par Wiztiti dans le forum Oracle
    Réponses: 2
    Dernier message: 01/06/2004, 16h14
  5. USER DEFINE FONCTION : PB éxécution requête
    Par juelo dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 26/01/2004, 11h12

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