2015-12-03 2 views
0

Я пробовал следующие запросы, чтобы проверить, является ли текущий год високосным или нет.Обработка значений NULL при установке значения переменной

Declare @leapyearstrt int = 0 

--1st query 
select @leapyearstrt = ISNULL(ISLEAPYEAR,0) 
         FROM [dbo].[TimeElement] 
         WHERE CurrentDate = getdate() 

--2nd query 
SET @leapyearstrt = (SELECT isnull(ISLEAPYEAR,0) 
         FROM [dbo].[TimeElement] 
         WHERE CurrentDate = getdate() 
         ) 

Если данные не существует в таблице для данной даты, первый запрос возвращает @leapyearstrt в 0, но второй запрос возвращает @leapyearstrt как NULL.

Почему это происходит? Как назначить значение 0 в операторе SET, если данные не существуют в таблице?

(PS: Я использовал SET присвоить значение, поскольку select может вернуть более одной строки)

+0

Нет записи нет значения – lad2025

+0

Если значение отсутствует, параметр должен вернуть присвоенное ему значение по умолчанию. это? – bmsqldev

+0

Возможный дубликат [SET по сравнению с SELECT при назначении переменных?] (Http://stackoverflow.com/questions/3945361/set-versus-select-when-assigning-variables) – lad2025

ответ

1

Прежде всего, если SELECT возвращает более чем на 1 строку, а затем SET (ваш второй запрос) не:

Subquery вернулся более чем на 1 значение. Это недопустимо, если подзапрос следует за =,! =, <, < =,>,> = или когда подзапрос используется как выражение.

Но переменное назначение в пределах SELECT (ваш первый запрос) работает. Однако не определено, какая строка будет использоваться для назначения конечного значения.


Если вы хотите использовать SET, то убедитесь, что SELECT возвращается в большинстве 1 ряд:

SET @leapyearstrt = (SELECT TOP(1) isnull(ISLEAPYEAR,0) 
         FROM [dbo].[TimeElement] 
         WHERE CurrentDate = getdate() 
     -- ideally you should add a proper ORDER BY to pick the row that you need 
         ); 

, а затем добавить эту строку кода, чтобы покрыть случай, когда SELECT возвращает 0 строк.

SET @leapyearstrt = ISNULL(@leapyearstrt, 0); 
0

Вы можете использовать ISNULL функцию, предполагая, что подзапрос возвращает одну строку:

SET @leapyearend = ISNULL((SELECT TOP 1 ISLEAPYEAR 
          FROM [dbo].[TimeElement] 
          WHERE CurrentDate = getdate() 
          ), 0) 

В разница между этими двумя заключается в том, что в первом запросе, если строка не найдена, назначение не выполняется вообще. Во второй версии это выполняется, если строка найдена или нет.

+2

Что делать, если подзапрос возвращает более одной строки? – lad2025

+0

@ lad2025, правильный комментарий, добавлена ​​коррекция, но из имен таблицы и столбцов я думаю, что она не должна возвращать более одной строки. –

+1

OP говорит: 'P.S: Я использовал SET для назначения значения, потому что select может возвращать более одной строки. – lad2025

Смежные вопросы