Передача значения параметра по умолчанию против не передачи параметра вообще?

Вот что я хочу сделать:

Учитывая стол

PeopleOutfit (id int primary key, boots int, hat int)

И хранимая процедура

UpdateOutfit @id int, @newBoots int = null, @newHat = null

Есть ли способ сказать, я назвал эту процедуру как

exec UpdateOutfit @id=1, @newBoots=null, @newHat=5

эффективно говоря, что человек с идентификатором 1 должен быть босиком и носить пятую шляпу от

exec UpdateOutfit @id=1, @newHat=5

что поручает этому человеку носить пятую шляпу, сохраняя свои нынешние сапоги?

Другими словами, я хочу сказать (в рамках хранимой процедуры), "использовалось ли значение по умолчанию, потому что оно не было указано" из "Я явно вызвал эту процедуру, передав значение, которое оказалось таким же, как значение по умолчанию".

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

Редактировать: передача зарезервированных значений не работает для полей с маленьким типом диапазона, таких как бит. Процедуры перегрузки также являются неприемлемым вариантом. Создание пользовательского типа, расширяющего парадигму NULL дополнительным значением "NotAValue", может быть ответом, но мне нужно больше рекомендаций о том, как его реализовать.

5 ответов

Решение

Я думаю, нет, вы не можете отличить эти две вещи друг от друга.

Я предлагаю использовать значение по умолчанию, которое вы никогда не передадите в качестве аргумента. т.е. если по умолчанию null, тогда, возможно, вы могли бы пройти в 0 в качестве значения для @newBoots

Нет, ноль по умолчанию "выглядит" так же, как переданный в ноль

возможно установите значение по умолчанию -1 и используйте логику, чтобы сделать что-то другое.

Строго говоря, нет, для этого нет никаких реальных возможностей. Однако вы можете попытаться использовать какое-то зарезервированное значение для параметра (например, очень маленькое отрицательное число), чтобы указать это.

Никогда не делал этого сам; ввел бит состояния 3 (используя целое число) в некоторый код для обработки ситуации с битами. У меня нет доступа к серверу sql, но иногда мне нравится латеральное мышление; но я думаю, что вы могли бы понять это с помощью строковых манипуляций над некоторыми представлениями / функциями управления. Вам нужно было бы работать с кучей привилегий, но если это абсолютно необходимо, я не понимаю, почему вы не можете сделать это из st.text, используя что-то вроде этого

SELECT  
    st.text
FROM
    sys.dm_exec_requests r
CROSS APPLY 
    sys.dm_exec_sql_text(sql_handle) AS st
WHERE
    r.session_id = @@SPID

Как уже говорилось, TSQL не различает предоставление значения по умолчанию и не предоставление значения. Я думаю, что движок в основном заменяет значения по умолчанию для любых отсутствующих параметров (или параметров, вызываемых с помощью ключевого слова DEFAULT).

Вместо этого используйте 0 в качестве "No Hat" и NULL в качестве не указанного параметра. Это предпочтительное использование NULL, где оно означает значение неизвестно или не указано. Используя NULL в качестве "No Hat", вы использовали его для добавления дополнительного значения в диапазон вашего типа данных.

Думайте об этом с точки зрения типа данных BIT. Тип данных определен для представления двоичного значения (1 или 0 или T/F, если вы предпочитаете думать о нем как о логическом значении.) Обрабатывая NULL как допустимое значение, вы расширили тип данных за пределы двоичных опций (теперь есть три варианта, 1/0/NULL.) Я всегда рекомендую, чтобы, если вы обнаружите, что у вас заканчиваются значения в текущем типе данных, вы используете слишком маленький тип.

Вернуться к вызову хранимой процедуры; если вы устанавливаете значения по умолчанию NULL и рассматриваете NULL как неустановленное или не указано, то вызывающие всегда должны указывать ненулевое значение при вызове proc. Если вы получите NULL, предположим, что они не указали значение, не указали NULL или не использовали ключевое слово DEFAULT.

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