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

StackOverflow https://stackoverflow.com/questions/837158

Вопрос

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

Учитывая таблицу

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

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

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

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

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

Это было полезно?

Решение

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

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

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

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

возможно установите значение по умолчанию -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 в качестве «без шляпы», вы использовали его для добавления дополнительного значения в диапазон вашего типа данных.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top