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

у меня есть этот скрипт:

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.

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

4 ответов


вы должны назвать это так

SELECT dbo.CheckIfSFExists(23, default)

С в TechNet:

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


вы можете назвать это тремя способами - с параметрами, по умолчанию и через 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

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

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

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

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

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

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