2011-05-02 89 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