T-SQL - функция с параметрами по умолчанию - PullRequest
138 голосов
/ 02 декабря 2011

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

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 ]

209 голосов
/ 02 декабря 2011

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

SELECT dbo.CheckIfSFExists(23, default)

С Technet :

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

36 голосов
/ 19 сентября 2013

Вы можете назвать это тремя способами - с параметрами, с 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
16 голосов
/ 02 декабря 2011

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

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

IF dbo.CheckIfSFExists( 23, default ) = 0
    SET @retValue = 'bla bla bla;
0 голосов
/ 26 января 2017

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...