Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 在sql函数中使用if语句_Sql Server - Fatal编程技术网

Sql server 在sql函数中使用if语句

Sql server 在sql函数中使用if语句,sql-server,Sql Server,我有这样的代码 create function factfind(@num integer) returns integer as begin if (@num=1) then return 1; else return(@num*factfind(@num-1)); end if; end 错误是,, Msg 156,第15级,状态1,程序factfind,第5行 关键字“then”附近的语法不正确。 Msg 156,第15级,状态1,程序factfind,第7行 关键字“else”

我有这样的代码

create function factfind(@num integer) 
returns integer 
as
begin
if   (@num=1) then
return 1;
else
return(@num*factfind(@num-1));
end if;
end
错误是,, Msg 156,第15级,状态1,程序factfind,第5行 关键字“then”附近的语法不正确。 Msg 156,第15级,状态1,程序factfind,第7行 关键字“else”附近的语法不正确。 Msg 195,第15级,第10状态,程序factfind,第8行 “factfind”不是可识别的内置函数名

请帮助我的朋友。

执行以下操作:

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
创建函数dbo.fakultät(@n十进制(38,0))
返回十进制(38,0)
作为
开始
声明@tmp十进制数(38,0)
如果(@n

Edit:需要是
dbo.factfind
,因为标量UDF必须是模式限定的

问题部分在于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 

由于返回两次,您不应该在其中包含一个
ELSE
?函数应该返回一个十进制(38.0),因为结果非常大,不能包含在12的整数中!CASE语句不需要“END”吗?
...
begin
    return ( CASE
                WHEN @num=1 THEN 1
                ELSE @num * dbo.factfind(@num-1)
             END
        );
end
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