использование инструкции if в функции sql

#sql-server

#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, Процедура поиска фактов, строка 5
Неправильный синтаксис возле ключевого слова ‘then’.
Сообщение 156, уровень 15, состояние 1, Процедура поиска фактов, строка 7
Неправильный синтаксис рядом с ключевым словом ‘else’.
Сообщение 195, уровень 15, состояние 10, процедура поиска фактов, строка 8
‘factfind’ не является распознанным именем встроенной функции.

пожалуйста, помогите мне, друзья.

Ответ №1:

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

Редактировать: должно быть dbo.factfind , потому что скалярные udfs должны соответствовать требованиям схемы

Комментарии:

1. Разве оператор CASE не требует ‘END’?

Ответ №2:

Выполните это:

 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
  

Ответ №3:

Проблема, с которой вы сталкиваетесь, частично связана с синтаксисом инструкции if в TSQL, правильная вещь, которую нужно сделать, это:

 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 
  

Комментарии:

1. Не следует ли вам включить туда ELSE , поскольку вы возвращаетесь дважды?

2. функция должна возвращать десятичное число (38.0), поскольку результаты довольно большие и не могут содержаться в целом числе из 12!