Содержание
sql — проверьте, является ли параметр нулевым или пустым в хранимой процедуре
спросил
Изменено
2 года, 1 месяц назад
Просмотрено
262к раз
Я знаю, как проверить, является ли параметр нулевым, но я не уверен, как проверить, является ли он пустым… У меня есть эти параметры, и я хочу проверить, являются ли предыдущие параметры пустыми или нулевыми, а затем установить их, как показано ниже
ПРОЦЕДУРА ИЗМЕНЕНИЯ [dbo].[GetSummary]
@PreviousStartDate NVARCHAR(50) ,
@PreviousEndDate NVARCHAR(50) ,
@CurrentStartDate NVARCHAR(50) ,
@CurrentEndDate NVARCHAR(50)
КАК
НАЧИНАТЬ
ЕСЛИ(@PreviousStartDate IS NULL ИЛИ EMPTY)
SET @PreviousStartdate = '01.01.2010' например..
Буду признателен за помощь.
- sql
- sql-server-2008
- хранимые процедуры
- параметры
- ноль
1
Я иногда использую NULLIF вот так…
IF NULLIF(@PreviousStartDate, '') IS NULL
Вероятно, нет никаких причин, по которым это лучше, чем способ, предложенный @Oded и @bluefeet, просто стилистические предпочтения.
Метод @danihp действительно классный, но мой усталый старый мозг не перешел к СЛИЯНИЮ, когда я думаю, что он пустой или нулевой 🙂
2
Вот общая схема:
ЕСЛИ(@PreviousStartDate IS NULL ИЛИ @PreviousStartDate = '')
'' — это пустая строка в SQL Server.
0
Я использую объединение:
ЕСЛИ ( ОБЪЕДИНЕНИЕ( @PreviousStartDate, '' ) = '' ) ...
вы можете использовать:
IF(@PreviousStartDate IS NULL OR @PreviousStartDate = '')
1
Как насчет объединения , объединения и nullif ?
КОМПЛЕКТ @PreviousStartDate = объединение (nullif(@PreviousStartDate, ''), '01/01/2010')
Другой вариант:
ЕСЛИ ISNULL(@PreviousStartDate, '') = '' ...
см. функцию, основанную на этом выражении, на http://weblogs.sqlteam.com/mladenp/archive/2007/06/13/60231.aspx
Чтобы проверить, является ли переменная нулевой или пустой, используйте это:
IF LEN (ISNULL(@var, '')) = 0
1
Если вы хотите использовать необязательный параметр, используйте его.
СОЗДАТЬ ПРОЦЕДУРУ uspGetAddress @City nvarchar(30) = NULL, @AddressLine1 nvarchar(60) = NULL
КАК
ВЫБРАТЬ *
ОТ AdventureWorks.Person.Address
ГДЕ Город = ISNULL(@Город,Город)
AND AddressLine1 LIKE '%' + ISNULL(@AddressLine1, AddressLine1) + '%'
ИДТИ
Чтобы проверить, является ли переменная нулевой или пустой, используйте этот
IF(@PreviousStartDate IS NULL ИЛИ @PreviousStartDate = '')
Я также рекомендую проверять недопустимые даты:
set @PreviousStartDate=case ISDATE(@PreviousStartDate)
когда 1, то @PreviousStartDate
еще '01.
01.2010'
конец
Если вам нужна проверка «Нулевой, пустой или пробел», вы можете избежать ненужных манипуляций со строками с помощью LTRIM и RTRIM , как это.
9]%’, @параметр), 0) > 0
РЕЙСЕРРОР …
2
Вы можете попробовать это: —
IF NULLIF(ISNULL(@PreviousStartDate,''),'') IS NULL УСТАНОВИТЕ @PreviousStartdate = '01.01.2010'
Зарегистрируйтесь или войдите в систему
Зарегистрируйтесь с помощью Google
Зарегистрироваться через Facebook
Зарегистрируйтесь, используя адрес электронной почты и пароль
Опубликовать как гость
Электронная почта
Обязательно, но не отображается
Опубликовать как гость
Электронная почта
Требуется, но не отображается
Как ограничить NULL в качестве параметра хранимой процедуры SQL Server?
Можно ли создать хранимую процедуру как
CREATE PROCEDURE Dummy
@ID ЦЕЛОЕ НЕ НУЛЕВОЕ
КАК
НАЧИНАТЬ
КОНЕЦ
Почему нельзя сделать что-то подобное?
- sql
- sql-server
- хранимые процедуры
Вы можете проверить его NULL-ness в sproc и RAISERROR , чтобы сообщить о состоянии вызывающему местоположению.
CREATE proc dbo.CheckForNull @i int
как
начинать
если @i равно нулю
raiserror('Значение @i не должно быть нулевым', 15, 1) -- с журналом
конец
ИДТИ
Затем вызовите:
exec dbo.CheckForNull @i = 1
или
exec dbo.CheckForNull @i = null
3
Ваш код правильный, разумный и даже хороший. Вам просто нужно дождаться SQL Server 2014 , который поддерживает такой синтаксис.
В конце концов, зачем перехватывать во время выполнения, если можно во время компиляции?
См. также этот документ Microsoft и найдите Natively Compiled там.
Как говорит dkrez, допустимость значений NULL не считается частью определения типа данных. Я все еще удивляюсь, почему бы и нет.
2
Ну что ж, кажется, я не могу редактировать пост @Unsliced, потому что «Это редактирование отклоняется от первоначального замысла поста.
Даже правки, которые должны вносить радикальные изменения, должны быть направлены на сохранение целей владельца поста».
Итак, (@crokusek и все заинтересованные) это мое предполагаемое решение:
Вы можете проверить его NULL-значение в sproc и RAISERROR , чтобы сообщить о состоянии вызывающему местоположению.
СОЗДАТЬ процедуру dbo.CheckForNull
@name sysname = 'параметр',
@значение sql_variant
как
начинать
если @значение равно нулю
raiserror('Значение %s не должно быть нулевым', 16, 1, @name) -- с логом
конец
ИДТИ
Затем вызовите:
exec dbo.CheckForNull @name 'whateverParamName', @value = 1
или
exec dbo.CheckForNull @value = null
5
Одна из причин, по которой вам может понадобиться такой синтаксис, заключается в том, что когда вы используете sp в мастере графического интерфейса набора данных C#, он создает функцию с параметрами, допускающими значение NULL, если нет ограничения NULL.
Никакая нулевая проверка в теле sp не помогает.
Проверка параметров в настоящее время не является функцией процедурной логики в SQL Server, а NOT NULL — это только один из возможных типов проверки данных. Тип данных CHAR в таблице имеет спецификацию длины. Это тоже должно быть реализовано? И как вы обрабатываете исключения? Существует обширная, хорошо разработанная и в некоторой степени основанная на стандартах методология обработки исключений в схемах таблиц; но не для процедурной логики, вероятно, потому, что процедурная логика определяется вне реляционных систем. С другой стороны, в хранимых процедурах уже есть существующий механизм для создания событий ошибок, привязанный к многочисленным API и языкам. Такой поддержки декларативных ограничений типа данных для параметров нет. Последствия его добавления обширны; тем более, что он хорошо поддерживается и расширяем, чтобы просто добавить код:
ЕСЛИ НЕНУЛЬ(@парам) ТО
поднять ошибку....
КОНЕЦ ЕСЛИ
Концепция NULL в контексте хранимой процедуры даже не определена четко, особенно по сравнению с контекстом таблицы или выражения SQL.


..
01.2010'
конец