Содержание
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.