Передача значения параметра по умолчанию против не передачи параметра вообще? - PullRequest
0 голосов
/ 08 мая 2009

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

С учетом таблицы

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 ]

1 голос
/ 08 мая 2009

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

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

1 голос
/ 08 мая 2009

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

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

0 голосов
/ 08 мая 2009

Как уже говорилось, 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.

0 голосов
/ 08 мая 2009

Никогда не делал этого сам; ввел бит состояния 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
0 голосов
/ 08 мая 2009

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

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