Новый необязательный параметр в функции базы данных SQL Server

У меня есть хранимая процедура, которая выглядит так:

CREATE FUNCTION [my_schema].[isEligible]
    (@product NUMERIC(8))
RETURNS INT
AS
BEGIN
    DECLARE @result INT;
    /* do eligibility checking, setting @result */
    RETURN @result;
END;

Это упоминается в нескольких существующих запросах, подобных этому:

SELECT *
FROM person
WHERE my_schema.isEligible(?) > -1 -- negative numbers are eligibility error codes

Где ? - параметр для данного идентификатора продукта.

В одном из нескольких запросов, вызывающих функцию, мне нужно передать новый дополнительный параметр @exception. Я хочу, чтобы функция по умолчанию вела себя так же, как и раньше, и изменяла поведение только для одного вызова, который будет передавать значение для @exception, поэтому я добавил новый параметр следующим образом:

CREATE FUNCTION [my_schema].[isEligible]
    (@product NUMERIC(8),
     @exception CHAR(1) = 'N')
RETURNS INT 
AS
BEGIN
    DECLARE @result INT;
    /*
    do eligibility checking (conditionally accounting for
    @exception being 'Y'), and setting @result 
    */
    RETURN @result;
END;

Но когда я развертываю новую версию функции и запускаю запрос, который проходит только в @product, я получаю An insufficient number of arguments were supplied for the procedure or function [my_schema].[isEligible]. Я думал, что добавление = 'N' предоставит значение по умолчанию и позволит избежать этой проблемы.

Я читал здесь, что иногда эта общая ошибка звучания фактически скрывает другие ошибки, которые не могут всплывать, но я не знаю, так ли это, поскольку он говорит о процедурах, а это функция. Не уверен, есть ли разница или функции не поддерживают необязательные аргументы, такие как процедуры.

Мне бы хотелось, чтобы по возможности не передавать NULL для нового параметра, что упростило бы развертывание обновленной версии функции. Есть ли способ вызвать эту функцию как isEligible(?), так и isEligible(?, ?), или мне нужно, чтобы первая была isEligible(?, NULL), чтобы она работала?

Если кому-то интересно, почему функция вместо подзапроса вызывает другие функции базы данных и имеет изрядную логику. Это плюс то, что он стал СУХИМ там, где он используется в нескольких запросах, я полагаю, поэтому он изначально был закодирован таким образом.

jinglesthula 13.06.2018 19:45

В принятом ответе на дубликат есть хорошая идея: создайте свою функцию с двумя параметрами под новым именем и превратите свою старую функцию в оболочку, которая вызывает новую функцию со значением по умолчанию для нового параметра. Тогда вам не нужно изменять какие-либо существующие вызовы функций, и вам нужно только помнить об использовании нового имени, когда вы хотите использовать оба параметра.

Tab Alleman 13.06.2018 19:49
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
2 120
1

Ответы 1

Вы можете вызвать свою функцию как:

SELECT *
FROM person
WHERE my_schema.isEligible(?, default) > -1

а также:

SELECT *
FROM person
WHERE my_schema.isEligible(?, value) > -1

Ах да. NULL, о котором я предполагал, на самом деле сделает @exceptionNULL, а не активирует значение по умолчанию 'N'. Таким образом, использование default в вызывающем коде было бы необходимо, вместо того, чтобы вообще ничего не передавать, позволяя автоматически использовать значение по умолчанию?

jinglesthula 13.06.2018 19:47

@jinglesthula Да, это обязательно.

Lukasz Szozda 13.06.2018 19:59

Другие вопросы по теме