2009-12-10 75 views
1

在表,返回功能使用if語句我簡化了我的功能如下:問題在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 

我不能使它工作..看來我有一些語法錯誤,但我無法弄清楚如何使其工作..任何想法?

回答

6

,你需要在「返回」部分中定義的表,然後插入語句來填充它:

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

這將被解析,但執行的時候,我得到一個錯誤: 「函數中包含的最後一個語句必須是返回語句」 – Stavros 2009-12-10 14:28:32

+0

還缺少一個「結束」。只需添加:「返回;結束」到Ray已經給出的結尾 – AdaTheDev 2009-12-10 14:31:55

+0

我已經更新了Ray的答案,只是爲了在 – AdaTheDev 2009-12-10 14:33:15

2

你必須用一個臨時名稱,並在函數聲明架構申報表,然後插入到它的功能:

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

,然後是這樣的:

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

該作品特別適用於在表格中插入多行的函數。

或者,如果你只希望返回一個SELECT的結果,你可以使用內嵌的回報:如果你想在函數中使用T-SQL代碼

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

傑里米說,或者如果它真的很喜歡你的簡單的例子,你可以這樣做:

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 

(即,你可能沒有定義表格VAR /模式)

+0

我的例子真的被簡化了,並且這個解決方案不能被應用:( – Stavros 2009-12-10 13:57:22

+0

好的,在這種情況下,+1給@ Jeremy的解決方案,我會留下我的答案,因爲它突出了潛力根據具體情況使用替代品 – AdaTheDev 2009-12-10 14:00:44

0

此代碼爲我工作:

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