Как ограничить NULL как параметр хранимой процедуры SQL Server? - PullRequest
35 голосов
/ 01 декабря 2008

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

CREATE PROCEDURE Dummy 
    @ID INT NOT NULL
AS
BEGIN
END

Почему нельзя сделать что-то подобное?

Ответы [ 4 ]

45 голосов
/ 01 декабря 2008

Вы можете проверить его NULL-ность в 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 
14 голосов
/ 20 августа 2014

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

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

См. Также этот документ MSDN и найдите там Natively Compiled.

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

0 голосов
/ 13 августа 2018

Ну, кажется, я не могу редактировать @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 
0 голосов
/ 01 декабря 2008

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

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

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

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

Существует причина, по которой хранимые процедуры не пишутся как функции C #.

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