#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!