none
SQL 2005 : problème à la création d'une procédure qui doit retourner le premier résultat d'une requête RRS feed

  • Question

  • Bonjour,

     

    Je cherche à créer une fonction qui retourne le résultat de la première ligne d'une requête SQL.

     

    J'ai essayé ce qui suit mais je récolte ce message d'erreur :

    Une instruction RETURN avec une valeur de retour ne peut être utilisée dans ce contexte. 

     

     

    Le code utilisé :

     

     
    
    USE mabase
    
    GO
    
    IF OBJECT_ID (N'mabase.test', N'IF') IS NOT NULL
    
      DROP FUNCTION mabase.test;
    
    GO
    
    CREATE FUNCTION mabase.test (@maprise varchar)
    
    RETURNS int
    
    WITH EXECUTE AS CALLER
    
    AS
    
    BEGIN
    
       DECLARE @MaVar int;
    
       SELECT @MaVar = count(*) as
    
       FROM dbo.AssoUtilisateursMateriel
    
       WHERE NomMateriel = @maprise
    
       GROUP NomMateriel
    
       RETURN(@MaVar);
    
    END;
    
    GO
    

     

     

    Une idée ?

     

    mercredi 27 juillet 2011 14:04

Réponses

  • Salut (^_^),

     

    Essaie ça (SET au lieu du Select)

    USE mabase
    
    GO
    
    IF OBJECT_ID (N'mabase.test', N'IF') IS NOT NULL
     DROP FUNCTION mabase.test;
    GO
    CREATE FUNCTION mabase.test (@maprise varchar)
    RETURNS int
    WITH EXECUTE AS CALLER
    AS
    BEGIN
      DECLARE @MaVar int;
      SET @MaVar = count(*) as
      FROM dbo.AssoUtilisateursMateriel
      WHERE NomMateriel = @maprise
      GROUP NomMateriel
      RETURN(@MaVar);
    END;
    GO
    

    Sinon, je ne suis pas sûr, mais je crois que tu peux dans le return mettre ton Select comme ceci :

     

    USE mabase
    
    GO
    
    IF OBJECT_ID (N'mabase.test', N'IF') IS NOT NULL
     DROP FUNCTION mabase.test;
    GO
    CREATE FUNCTION mabase.test (@maprise varchar)
    RETURNS int
    WITH EXECUTE AS CALLER
    AS
    RETURN(
      SELECT count(*) as
      FROM dbo.AssoUtilisateursMateriel
      WHERE NomMateriel = @maprise
      GROUP NomMateriel
    )
    END;
    GO

    Bon courage (^__^)


    David POULIN, Expert .NET (WPF, Silverlight et Windows Phone) chez Soat - Vous avez été aidé grâce à une réponse ? Pensez à la suggérer comme réponse afin que le thread puisse être marqué comme résolu. Merci ;)
    mercredi 27 juillet 2011 14:17
  • Bonjour,

     

    Après 2heures de galère, la bonne syntaxe a été trouvée.

    Effectivement il faut faire un SET @MaVar = (SELECT etc … , mais pas seulement. Il faut déclarer la taille du varchar qui sinon est à 1 par défaut, il y avait un AS en trop etc, enfin bref, maintenant cela fonctionne. Au final cela donne :

     

    CREATE FUNCTION MaFonction (@maprise varchar (255))

     

    RETURNS int

    WITH EXECUTE AS CALLER

    AS

     

    BEGIN

          DECLARE @MaVar int;

          SET @MaVar = (SELECT count(*) FROM dbo.AssoUtilisateursMateriel WHERE NomMateriel = @maprise GROUP BY NomMateriel)

          RETURN(@MaVar);

    END;

     

    GO

     

    Pour exploiter la fonction, il faut faire :

     

    select dbo.MaFonction('Prise1') 

     

    Merci d'avoir répondu !

    mardi 2 août 2011 12:54

Toutes les réponses

  • Salut (^_^),

     

    Essaie ça (SET au lieu du Select)

    USE mabase
    
    GO
    
    IF OBJECT_ID (N'mabase.test', N'IF') IS NOT NULL
     DROP FUNCTION mabase.test;
    GO
    CREATE FUNCTION mabase.test (@maprise varchar)
    RETURNS int
    WITH EXECUTE AS CALLER
    AS
    BEGIN
      DECLARE @MaVar int;
      SET @MaVar = count(*) as
      FROM dbo.AssoUtilisateursMateriel
      WHERE NomMateriel = @maprise
      GROUP NomMateriel
      RETURN(@MaVar);
    END;
    GO
    

    Sinon, je ne suis pas sûr, mais je crois que tu peux dans le return mettre ton Select comme ceci :

     

    USE mabase
    
    GO
    
    IF OBJECT_ID (N'mabase.test', N'IF') IS NOT NULL
     DROP FUNCTION mabase.test;
    GO
    CREATE FUNCTION mabase.test (@maprise varchar)
    RETURNS int
    WITH EXECUTE AS CALLER
    AS
    RETURN(
      SELECT count(*) as
      FROM dbo.AssoUtilisateursMateriel
      WHERE NomMateriel = @maprise
      GROUP NomMateriel
    )
    END;
    GO

    Bon courage (^__^)


    David POULIN, Expert .NET (WPF, Silverlight et Windows Phone) chez Soat - Vous avez été aidé grâce à une réponse ? Pensez à la suggérer comme réponse afin que le thread puisse être marqué comme résolu. Merci ;)
    mercredi 27 juillet 2011 14:17
  • Bonjour, ChrisFromParis,

     

    Est-ce que vous avez testé la solution proposée ? Merci pour partager avec nous les résultats, afin que d'autres personnes avec le même problème puissent profiter de cette solution.

     

    Cordialement,

     

    Cipri


    Suivez MSDN sur Twitter   Suivez MSDN sur Facebook


    Ciprian DUDUIALA, MSFT  
    •Nous vous prions de considérer que dans le cadre de ce forum on n’offre pas de support technique et aucune garantie de la part de Microsoft ne peut être offerte.

    lundi 1 août 2011 09:39
  • Bonjour,

     

    Après 2heures de galère, la bonne syntaxe a été trouvée.

    Effectivement il faut faire un SET @MaVar = (SELECT etc … , mais pas seulement. Il faut déclarer la taille du varchar qui sinon est à 1 par défaut, il y avait un AS en trop etc, enfin bref, maintenant cela fonctionne. Au final cela donne :

     

    CREATE FUNCTION MaFonction (@maprise varchar (255))

     

    RETURNS int

    WITH EXECUTE AS CALLER

    AS

     

    BEGIN

          DECLARE @MaVar int;

          SET @MaVar = (SELECT count(*) FROM dbo.AssoUtilisateursMateriel WHERE NomMateriel = @maprise GROUP BY NomMateriel)

          RETURN(@MaVar);

    END;

     

    GO

     

    Pour exploiter la fonction, il faut faire :

     

    select dbo.MaFonction('Prise1') 

     

    Merci d'avoir répondu !

    mardi 2 août 2011 12:54
  • Bonjour,

     

    Merci de tenir la communauté informée sur la suite de vos démarches.

     

    Bonne journée,

     

    Cipri


    Suivez MSDN sur Twitter   Suivez MSDN sur Facebook


    Ciprian DUDUIALA, MSFT  
    •Nous vous prions de considérer que dans le cadre de ce forum on n’offre pas de support technique et aucune garantie de la part de Microsoft ne peut être offerte.

    mardi 2 août 2011 12:56