Подтвердить что ты не робот

Как ограничить NULL как параметр хранимой процедуры SQL Server?

Можно ли создать хранимую процедуру как

CREATE PROCEDURE Dummy 
    @ID INT NOT NULL
AS
BEGIN
END

Почему невозможно сделать что-то вроде этого?

4b9b3361

Ответ 1

Проверка параметров в настоящее время не является функцией процедурной логики в SQL Server, а NOT NULL - это только один возможный тип проверки данных. Тип данных CHAR в таблице имеет спецификацию длины. Должны ли это быть реализованы? И как вы справляетесь с исключениями? Существует обширная, высокоразвитая и несколько стандартная методология обработки исключений в схемах таблиц; но не для процедурной логики, вероятно, потому, что процедурная логика определяется из реляционных систем. С другой стороны, хранимые процедуры уже имеют существующий механизм для повышения ошибок, связанных с многочисленными API и языками. Нет такой поддержки ограничений декларативных типов данных для параметров. Последствия его добавления обширны; тем более, что он хорошо поддерживается и расширяется, чтобы просто добавить код:

IF ISNULL(@param) THEN
    raise error ....
END IF

Концепция NULL в контексте хранимой процедуры даже не определена, особенно по сравнению с контекстом таблицы или выражения SQL. И это не определение Microsoft. Группы стандартов SQL провели много лет, производя много литературы, устанавливая поведение NULL и границы определений для этого поведения. И хранимые процедуры не являются одним из них.

Хранимая процедура должна быть максимально легкой, чтобы сделать производительность базы данных максимально эффективной. Типы данных не нужны для проверки, но позволяют компилятору предоставить оптимизатору запросов лучшую информацию для составления наилучшего возможного плана запроса. Ограничение NOT NULL для параметра направляется по целому пути, что делает компилятор более сложным для новой цели проверки аргументов. И, следовательно, менее эффективный и тяжелый.

Там хранимые процедуры причины не записываются как функции С#.

Ответ 2

Вы можете проверить его 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 

Ответ 3

Ваш код правильный, разумный и даже хорошая практика. Вам просто нужно подождать SQL Server 2014, который поддерживает этот синтаксис.

В конце концов, зачем ловить во время выполнения, когда вы можете время компиляции?

См. также этот файл msdn и найдите Natively Compiled там.

Как говорит dkrez, nullabiliy не считается частью определения типа данных. Я все еще удивляюсь, почему бы и нет.

Ответ 4

Что ж, похоже, я не могу редактировать пост @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 

Ответ 5

Одна из причин, по которой вам может понадобиться такой синтаксис, заключается в том, что при использовании sp в мастере графического интерфейса набора данных С# он создает функцию с обнуляемыми параметрами, если нет нулевого ограничения. Никакая нулевая проверка в теле sp не помогает этому.