Проверка параметра в настоящее время не является функцией процедурной логики в SQL Server, и NOT NULL является только одним возможным типом подтверждения правильности данных. Тип данных char в таблице имеет спецификацию длины. Это должно быть реализовано также? И как Вы обрабатываете исключения? Существует обширная, высоко разработанная и несколько основанная на стандартах методология для обработки исключений в схемах таблицы; но не для процедурной логики, вероятно, потому что процедурная логика определяется из реляционных систем. С другой стороны, хранимые процедуры уже имеют существующий механизм для того, чтобы сгенерировать ошибочные события, набросился на многочисленные API и языки. Нет такой поддержки декларативных ограничений типа данных на параметры. Последствия добавления его обширны; тем более, что это хорошо поддерживается и расширяемое, для простого добавления кода:
IF ISNULL(@param) THEN
raise error ....
END IF
понятие ПУСТОГО УКАЗАТЕЛЯ в контексте хранимой процедуры даже не четко определено особенно по сравнению с контекстом таблицы или SQL-выражения. И это не определение Microsoft. Группы стандартов SQL провели много лет, генерировав большую литературу, устанавливающую поведение ПУСТОГО УКАЗАТЕЛЯ и границы определений для того поведения. И хранимые процедуры не являются одним из них.
хранимая процедура А разработана, чтобы быть максимально легкой для создания производительности базы данных максимально эффективной. Типы данных параметров там не для проверки, но позволять компилятору дать оптимизатору запросов лучшую информацию для компиляции самого лучшего плана запросов. Ограничение NOT NULL на параметр направляется вниз целый путь nother путем создания компилятора более сложным для новой цели проверить аргументы. И следовательно менее эффективный и более тяжелый.
существует причина, которая не записаны хранимые процедуры, поскольку C# функционирует.
Вы могли проверить на его ПУСТОЕ в sproc и RAISERROR
для сообщения состояния к местоположению вызова.
CREATE proc dbo.CheckForNull @i int
as
begin
if @i is null
raiserror('The value for @i should not be null', 15, 1) -- with log
end
GO
Тогда вызов:
exec dbo.CheckForNull @i = 1
или
exec dbo.CheckForNull @i = null
Одна причина, почему Вам, возможно, понадобится такой синтаксис, состоит в том, что при использовании SP в мастере графического интерфейса пользователя набора данных C# он создает функцию с nullable параметрами, если нет никакого пустого ограничения. Никакая пустая регистрация тела SP не помогает ему.