Можно ли создать хранимую процедуру как
CREATE PROCEDURE Dummy
@ID INT NOT NULL
AS
BEGIN
END
Почему невозможно сделать что-то вроде этого?
Можно ли создать хранимую процедуру как
CREATE PROCEDURE Dummy
@ID INT NOT NULL
AS
BEGIN
END
Почему невозможно сделать что-то вроде этого?
Проверка параметров в настоящее время не является функцией процедурной логики в SQL Server, а NOT NULL - это только один возможный тип проверки данных. Тип данных CHAR в таблице имеет спецификацию длины. Должны ли это быть реализованы? И как вы справляетесь с исключениями? Существует обширная, высокоразвитая и несколько стандартная методология обработки исключений в схемах таблиц; но не для процедурной логики, вероятно, потому, что процедурная логика определяется из реляционных систем. С другой стороны, хранимые процедуры уже имеют существующий механизм для повышения ошибок, связанных с многочисленными API и языками. Нет такой поддержки ограничений декларативных типов данных для параметров. Последствия его добавления обширны; тем более, что он хорошо поддерживается и расширяется, чтобы просто добавить код:
IF ISNULL(@param) THEN
raise error ....
END IF
Концепция NULL в контексте хранимой процедуры даже не определена, особенно по сравнению с контекстом таблицы или выражения SQL. И это не определение Microsoft. Группы стандартов SQL провели много лет, производя много литературы, устанавливая поведение NULL и границы определений для этого поведения. И хранимые процедуры не являются одним из них.
Хранимая процедура должна быть максимально легкой, чтобы сделать производительность базы данных максимально эффективной. Типы данных не нужны для проверки, но позволяют компилятору предоставить оптимизатору запросов лучшую информацию для составления наилучшего возможного плана запроса. Ограничение NOT NULL для параметра направляется по целому пути, что делает компилятор более сложным для новой цели проверки аргументов. И, следовательно, менее эффективный и тяжелый.
Там хранимые процедуры причины не записываются как функции С#.
Вы можете проверить его NULL-ness в 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
Ваш код правильный, разумный и даже хорошая практика. Вам просто нужно подождать SQL Server 2014, который поддерживает этот синтаксис.
В конце концов, зачем ловить во время выполнения, когда вы можете время компиляции?
См. также этот файл msdn и найдите Natively Compiled
там.
Как говорит dkrez, nullabiliy не считается частью определения типа данных. Я все еще удивляюсь, почему бы и нет.
Что ж, похоже, я не могу редактировать пост @Unsliced, потому что "это изменение отличается от первоначального намерения поста. Даже изменения, которые должны внести радикальные изменения, должны стремиться сохранить цели владельца поста".
Так что (@crokusek и все заинтересованные) это мое решение:
Вы можете проверить его NULL-ность в sproc и RAISERROR
чтобы сообщить о состоянии обратно в вызывающее местоположение.
CREATE proc dbo.CheckForNull
@name sysname = 'parameter',
@value sql_variant
as
begin
if @value is null
raiserror('The value for %s should not be null', 16, 1, @name) -- with log
end
GO
Затем позвоните:
exec dbo.CheckForNull @name 'whateverParamName', @value = 1
или же
exec dbo.CheckForNull @value = null
Одна из причин, по которой вам может понадобиться такой синтаксис, заключается в том, что при использовании sp в мастере графического интерфейса набора данных С# он создает функцию с обнуляемыми параметрами, если нет нулевого ограничения. Никакая нулевая проверка в теле sp не помогает этому.