2009-12-10 9 views
1

j'ai simplifié ma fonction à ce qui suit:problème avec l'instruction if utilisée au tableau-fonction retour dans SQL

create function [dbo].[UserSuperTeams](@ProjectId int) 
returns table 
as 
return 
    if @ProjectId=0 
    begin 
     select TeamId from TblTeam t 
     union 
     select 0 as TeamId 
    end 
    else 
    begin 
     select t.TeamId from TblTeam t 
     union 
     select 1 as TeamId 
    end; 
go 

Je ne peux pas le faire fonctionner .. Il semble que j'ai quelques erreurs de syntaxe, mais je ne peut pas comprendre comment le faire fonctionner .. Une idée?

Répondre

6

Si vous allez utiliser le code T-SQL dans la fonction, vous devez définir la table dans la section « rendement », puis le remplir avec des instructions d'insertion:

create function [dbo].[UserSuperTeams](@ProjectId int) 
    returns @results table (
    TeamId int 
) as begin 

    if @ProjectId=0 begin  
    insert @results (TeamId) 
     select TeamId from TblTeam t 
     union  
     select 0 as TeamId 
    end 
    else begin 
    insert @results (TeamId) 
     select t.TeamId from TblTeam t 
     union  
     select 1 as TeamId 
end; 

return 
end 
+0

ce sera analysé, mais lorsqu'il est exécuté, je reçois une erreur: "La dernière instruction incluse dans une fonction doit être une instruction return" – Stavros

+0

Il manque également une "fin". Il suffit d'ajouter: "return; end" à la fin de ce que Ray a donné – AdaTheDev

+0

J'ai mis à jour la réponse de Ray, juste pour ajouter la déclaration de retour dans – AdaTheDev

2

Vous devez déclarer la table avec un nom temporaire et un schéma dans la déclaration de fonction, puis insérez dans dans la fonction:

create function [dbo].[UserSuperTeams](@ProjectId int) 
returns @mytable table (TeamID int) 
as 
... 

puis quelque chose comme:

INSERT INTO @mytable 
select t.TeamId from TblTeam t 
    union 
select 1 as TeamId 

Cela fonctionne particulièrement bien pour les fonctions qui insèrent plusieurs lignes dans la table.

Sinon, si vous ne souhaitez retourner les résultats d'un seul SELECT, vous pouvez utiliser un retour en ligne:

BEGIN 
    RETURN (
     select t.TeamId from TblTeam t 
      union 
     select 1 as TeamId 
    ) 
END 
1

comme Jeremy a dit, ou si elle est vraiment très comme votre exemple simplifié que vous pouvez faire:

create function [dbo].[UserSuperTeams](@ProjectId int) 
returns table 
as 
return (select TeamId from TblTeam t 
     union 
     select CASE WHEN @ProjectId = 0 THEN 0 ELSE 1 END as TeamId 
     ) 
go 

(c.-à-d. vous ne pouvez pas avoir à définir la table var/schéma)

+0

mon exemple a été vraiment simplifié et cette solution ne peut pas être appliquée :( – Stavros

+0

Ah ok Dans ce cas, la solution de +1 à @ Jeremy Je vais laisser ma réponse car elle met en évidence le potentiel utilisation d'une alternative dépendant du scénario exact – AdaTheDev

0

ce code fonctionne pour moi:

DROP FUNCTION IF EXISTS [dbo].[test] 
 
GO 
 

 
CREATE FUNCTION [dbo].[TEST] 
 
(
 
\t @ACTIVEONLY bit 
 
) 
 
RETURNS @TST TABLE (column1 char) 
 
AS 
 
BEGIN 
 
\t IF @ACTIVEONLY = 1 
 
\t BEGIN 
 
\t \t INSERT INTO @TST(column1) VALUES('A') 
 
\t END 
 
\t ELSE 
 
\t BEGIN 
 
\t \t INSERT INTO @TST(column1) VALUES('B') 
 
\t END 
 
\t RETURN 
 
END 
 
GO 
 

 
SELECT * FROM [dbo].[TEST](1) 
 
GO 
 

 
SELECT * FROM [dbo].[TEST](0) 
 
GO