T-SQL - функция с параметрами по умолчанию

У меня есть этот script:

CREATE FUNCTION dbo.CheckIfSFExists(@param1 INT, @param2 BIT = 1 )
RETURNS BIT
AS
BEGIN
    IF EXISTS ( bla bla bla )
        RETURN 1;
    RETURN 0;
END
GO

Я хочу использовать его в процедуре следующим образом:

IF dbo.CheckIfSFExists( 23 ) = 0
    SET @retValue = 'bla bla bla';

Но я получаю ошибку:

Недостаточное количество аргументов было предоставлено для процедуры или функции dbo.CheckIfSFExists.

Почему это не работает?

Ответ 1

вы должны называть его следующим образом

SELECT dbo.CheckIfSFExists(  23, default )

От Technet:

Когда параметр функции имеет значение по умолчанию, ключевое слово Значение DEFAULT должно указываться при вызове функции для того, чтобы получить значение по умолчанию. Такое поведение отличается от использования параметры со значениями по умолчанию в хранимых процедурах, в которых отсутствует параметр также подразумевает значение по умолчанию. Исключение из этого поведение при вызове скалярной функции с помощью EXECUTE выражение. При использовании EXECUTE ключевое слово DEFAULT не требуется.

Ответ 2

Вы можете назвать это тремя способами - с параметрами, с DEFAULT и через EXECUTE

SET NOCOUNT ON;

DECLARE
@Table  SYSNAME = 'YourTable',
@Schema SYSNAME = 'dbo',
@Rows   INT;

SELECT dbo.TableRowCount( @Table, @Schema )

SELECT dbo.TableRowCount( @Table, DEFAULT )

EXECUTE @Rows = dbo.TableRowCount @Table

SELECT @Rows

Ответ 3

С пользовательскими функциями вы должны объявить каждый параметр, даже если они имеют значение по умолчанию.

Следующее будет выполнено успешно:

IF dbo.CheckIfSFExists( 23, default ) = 0
    SET @retValue = 'bla bla bla;

Ответ 4

Одним из способов решения этой проблемы является использование хранимых процедур с выходным параметром.

exec sp_mysprocname @returnvalue output, @firstparam = 1, @secondparam = 2

которые вы не передаете по умолчанию, по умолчанию, установленным в самой хранимой процедуре. И вы можете получить результаты от вашей выходной переменной.