Проверка параметров в настоящее время не является функцией процедурной логики в SQL Server, и NOT NULL - это только один из возможных типов проверки данных. Тип данных CHAR в таблице имеет спецификацию длины. Должно ли это быть реализовано? И как вы обрабатываете исключения? Существует обширная, высокоразвитая и несколько основанная на стандартах методология обработки исключений в схемах таблиц; но не для процедурной логики, возможно потому, что процедурная логика определяется вне реляционных систем. С другой стороны, хранимые процедуры уже имеют существующий механизм для вызова событий ошибок, связанных с многочисленными API и языками. Нет такой поддержки декларативных ограничений типов данных для параметров. Последствия добавления этого обширны; тем более что он хорошо поддерживается и расширяется, просто добавляя код:
IF ISNULL(@param) THEN
raise error ....
END IF
Понятие NULL в контексте хранимой процедуры даже четко не определено, особенно по сравнению с контекстом таблицы или выражения SQL. И это не определение Microsoft. Группы стандартов SQL потратили много лет на создание большого количества литературы, устанавливающей поведение NULL и границы определений для этого поведения. И хранимые процедуры не являются одним из них.
Хранимая процедура разработана таким образом, чтобы максимально облегчить ее, чтобы сделать производительность базы данных максимально эффективной. Типы данных параметров предназначены не для проверки, а для того, чтобы дать возможность компилятору предоставлять оптимизатору запросов лучшую информацию для составления наилучшего возможного плана запроса. Ограничение NOT NULL для параметра направляется по всему другому пути, делая компилятор более сложным для новой цели проверки аргументов. И, следовательно, менее эффективный и тяжелый.
Существует причина, по которой хранимые процедуры не пишутся как функции C #.