2011-05-02 111 views
4

我有這樣使用,如果在SQL函數聲明

create function factfind(@num integer) 
returns integer 
as 
begin 
if (@num=1) then 
return 1; 
else 
return(@num*factfind(@num-1)); 
end if; 
end 

錯誤代碼是, 消息156,級別15,狀態1,過程factfind,線附近關鍵字5 語法不正確「然後」 。 Msg 156,Level 15,State 1,Procedure factfind,Line 7 關鍵字'else'附近的語法不正確。 Msg 195,Level 15,State 10,Procedure factfind,Line 8 'factfind'不是公認的內置函數名稱。

請幫我朋友。

回答

1

執行此:

CREATE FUNCTION dbo.fakultät(@n DECIMAL(38,0)) 
RETURNS DECIMAL(38,0) 
AS 
BEGIN 
DECLARE @tmp DECIMAL(38,0) 
    IF (@n <= 1) 
     SELECT @tmp = 1 
ELSE 
    SELECT @tmp = @n * dbo.fakultät(@n - 1) 
RETURN @tmp 
END 

或:

CREATE FUNCTION dbo.Factorial (@iNumber int) 
RETURNS INT 
AS 
BEGIN 
DECLARE @i int 

    IF @iNumber <= 1 
     SET @i = 1 
    ELSE 
     SET @i = @iNumber * dbo.Factorial(@iNumber - 1) 
RETURN (@i) 
END 
+0

感謝朋友,它有很大幫助 – anvisha 2011-05-04 05:31:41

6
... 
begin 
    return (CASE 
       WHEN @num=1 THEN 1 
       ELSE @num * dbo.factfind(@num-1) 
      END 
     ); 
end 

編輯:必須是dbo.factfind,因爲標量UDF必須是模式限定的

+0

CASE語句是否需要'結束'? – 2017-08-17 12:04:25

+0

@ZachSmith是的,謝謝 – gbn 2017-08-18 09:52:20

2

你的問題是,部分在TSQL中if語句的語法,正確的做法是:

create function factfind(@num integer) 
returns integer 
as 
begin 
    declare @Result int 
    set @Result = 1 
    if (@num>1) 
    set @Result = @num * dbo.factfind(@num-1); 
    return @Result 
end 
+0

既然你回來兩次,你不應該在其中加入一個ELSE嗎? – JNK 2011-05-02 14:51:42

+0

請嘗試我的功能,請小一些,我認爲是正確的 – mariocase84 2011-05-02 14:57:02

+0

該函數應該返回一個十進制(38.0),因爲結果非常大,不能包含在從12開始的整數中! – mariocase84 2011-05-02 15:54:25