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 :

Fonction et returns table


Sujet :

MS SQL Server

  1. #1
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    272
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 272
    Points : 166
    Points
    166
    Par défaut Fonction et returns table
    Salut,

    J'essai de faire une fonction qui me retourne une table, cette fonction remplit une table temporaire a l'aide de 2 autres tables, petit probleme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    CREATE FUNCTION BASE_ET_SECTION () 
    RETURNS INT
    AS
    BEGIN etc....
    Ca marche, mais c'est pas ce que j'attends, ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    CREATE FUNCTION BASE_ET_SECTION () 
    RETURNS TABLE
    AS
    BEGIN etc...
    Me fait une erreur. Je termine bien ma fonction par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    	RETURN (SELECT NOM FROM @tempo )
    END
    Mais rien n'y fait, pourquoi cette erreur, alors qu'une procedure du type

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    CREATE FUNCTION TOTO ()
    RETURNS TABLE
    AS
    RETURN
    (
       SELECT NOM FROM TABLE
    )
    fonctionne ?

    Si je met mon code ( creation et remplissage de table tempo ) dans les parentheses de le fonction toto, ca me donne aussi une erreur.

    Peut-on faire une fonction "compliqué" qui renvoi néanmoins une table ?

    Merci par avance.

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    434
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 434
    Points : 502
    Points
    502
    Par défaut Re: Fonction et returns table
    Citation Envoyé par Lovmy
    Je termine bien ma fonction par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    	RETURN (SELECT NOM FROM @tempo )
    END
    Ben la voilà l'erreur. Tu peux pas mettre ton nom de table dans une variable.
    Si tu fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    RETURN(SELECT NOM FROM TEMPO)
    ca passe sans pb

  3. #3
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    272
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 272
    Points : 166
    Points
    166
    Par défaut Eh non !
    Salut,

    voici mon code:
    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
     
    CREATE FUNCTION BASE_ET_SECTION () 
    RETURNS INT
    AS
    BEGIN 
    	DECLARE @tempo TABLE ( NOM char(50), PRENOM char(50)) 
     
    	DECLARE curseur CURSOR FOR SELECT NOM,PRENOM FROM TOTO
    	OPEN curseur
    	DECLARE @NOM char(50)
    	DECLARE @PRENOM char(50)
     
    	FETCH NEXT FROM curseur INTO @NOM, @PRENOM
    	WHILE (@@FETCH_STATUS = 0)
    	BEGIN
    		INSERT @tempo VALUES (  @NOM, @PRENOM )
    		FETCH NEXT FROM curseur INTO @NOM, @PRENOM
    	END
     
    	CLOSE curseur
    	DEALLOCATE curseur
     
    	RETURN (SELECT BASE_NOM FROM TEMPO )
     
    END
    La ca marche, mais ce que je veux c'est qu'il me renvoi une table et non un int, donc je remplace

    RETURNS INT

    par

    RETURNS TABLE

    et la j'ai l'erreur:

    Syntaxe incorrecte vers 'BEGIN'

    ( le fait de remplacer RETURN (SELECT BASE_NOM FROM @tempo ) par
    RETURN (SELECT BASE_NOM FROM TEMPO ) n'a rien change )

    Merci par avance

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    434
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 434
    Points : 502
    Points
    502
    Par défaut
    Rassure moi ce n'est qu'un exemple n'est-ce pas c'est pas ton code ?
    Je ne vois pas l'utilité ici d'utiliser un curseur dans ton cas particulier.
    Tu pourrais tout aussi bien faire un RETURN(select * from TOTO)

    Nénamoins, voici la technique : dans le RETURNS TABLE tu dois déclarer le table :
    J'espère que cela va-t-aider :
    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
     
    CREATE FUNCTION BASE_ET_SECTION () 
    RETURNS @TOTO TABLE ( NOM char(50) null , PRENOM char(50) null) 
    AS 
    BEGIN
       DECLARE @tempo TABLE ( NOM char(50) null , PRENOM char(50) null) 
     
       DECLARE curseur CURSOR FOR SELECT NOM,PRENOM FROM TOTO 
       OPEN curseur 
       DECLARE @NOM char(50) 
       DECLARE @PRENOM char(50) 
     
       FETCH NEXT FROM curseur INTO @NOM, @PRENOM 
       WHILE (@@FETCH_STATUS = 0) 
       BEGIN 
          INSERT INTO @tempo VALUES (  @NOM, @PRENOM ) 
          FETCH NEXT FROM curseur INTO @NOM, @PRENOM 
       END 
     
       CLOSE curseur 
       DEALLOCATE curseur 
     
       INSERT INTO @TOTO
       SELECT * FROM @TEMPO
     
       RETURN 
    END
     
    select * from BASE_ET_SECTION ()
    A+

  5. #5
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    272
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 272
    Points : 166
    Points
    166
    Par défaut Merci
    Re,

    Je te rassure, ce n'est qu'un exemple.

    OK ca marche, merci encore !

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    434
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 434
    Points : 502
    Points
    502
    Par défaut
    passe ton post au statut résolu alors

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Bonjour,

    Désolé de dépoussiérer ce sujet, mais j'ai à peu de choses près le même problème.

    Je voudrais créer une fonction qui retourne
    • Soit la table en entier si aucun paramètre n'est passé (param Is Null)
    • soit la ligne correspondant à l'Id passé en paramètre...


    Cependant, lorsque je Declare une Table, il me met "la variable @maTable doit être déclarée" (alors qu'elle l'est) puis "Syntaxe incorrecte vers BEGIN"

    Que faire?

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

    Sans votre code, difficile à dire.

    Notez en plus que les fonctions qui retournent une variable de type table sont gourmandes en ressources, et provoquent ce qu'on appelle le RBAR

    @++

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Re,

    En fait, je me suis penché sur le problème avec une collègue et c'est résolu.

    Pour ce qui est des resources, ça ira je pense XD La table retournée fera maximum 3 lignes (bibliothèque très courte)

    Merci quand même ^^'


    (mon erreur avait été de ne pas déclarer de table temporaire...)

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

Discussions similaires

  1. Fonction avec return table
    Par Aethia dans le forum Sybase
    Réponses: 6
    Dernier message: 11/12/2013, 18h39
  2. Réponses: 2
    Dernier message: 27/07/2006, 07h46
  3. Réponses: 7
    Dernier message: 28/02/2006, 16h46
  4. update en fonction de 2 tables
    Par logisoftfr dans le forum Langage SQL
    Réponses: 2
    Dernier message: 13/01/2006, 19h33
  5. [plsql] fonction et return d'une collection
    Par Michael# dans le forum Oracle
    Réponses: 4
    Dernier message: 01/12/2005, 09h45

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