Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Не понятна логика  [new]
Молодой
Member

Откуда: Москва
Сообщений: 180
Добрый день
нашел вот такую "багу" в коде:

declare @t table (id int)
declare @Id int = 0
select TOP 1     id    FROM @t WHERE  1=2
select TOP 1   @Id = id    FROM @t WHERE  1=2
select @Id


Написавший думал что @Id будет Null на выходе а он оказывается равен 0
По мне, так это вполне логично что на выходе д.б. Null

Вопрос: где я не прав ?
29 июл 14, 13:36    [16370952]     Ответить | Цитировать Сообщить модератору
 Re: Не понятна логика  [new]
Wlr-l
Member

Откуда:
Сообщений: 601
Здесь:

declare @Id int = 0
29 июл 14, 13:45    [16370997]     Ответить | Цитировать Сообщить модератору
 Re: Не понятна логика  [new]
Молодой
Member

Откуда: Москва
Сообщений: 180
хорошо, а что произошло вот здесь?
select TOP 1   @Id = id    FROM @t WHERE  1=2
29 июл 14, 13:47    [16371008]     Ответить | Цитировать Сообщить модератору
 Re: Не понятна логика  [new]
gandjustas
Member

Откуда:
Сообщений: 857
Блог
Молодой,

SELECT возвращает 0 строк, поэтому присваивание выполняется 0 раз.
29 июл 14, 13:48    [16371010]     Ответить | Цитировать Сообщить модератору
 Re: Не понятна логика  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1887
если хочется получить null ))
declare @t table (id int)
declare @Id int = 0
select @Id = max(id)    FROM @t 
select @Id
29 июл 14, 13:50    [16371026]     Ответить | Цитировать Сообщить модератору
 Re: Не понятна логика  [new]
Молодой
Member

Откуда: Москва
Сообщений: 180
Не, на самом деле оказался прав gandjustas
ведь помню - говорила мама - пользуй лучше Set а не Select
- Грабли понятны. Вопрос снят

declare @t table (id int)
declare @Id int = 0

set @Id = (select TOP 1   id    FROM @t WHERE  1=2 )
select @Id
29 июл 14, 13:55    [16371048]     Ответить | Цитировать Сообщить модератору
 Re: Не понятна логика  [new]
Glory
Member

Откуда:
Сообщений: 104751
http://technet.microsoft.com/en-us/library/aa259186(v=sql.80).aspx

If the SELECT statement returns no rows, the variable retains its present value. If expression is a scalar subquery that returns no value, the variable is set to NULL.
29 июл 14, 13:58    [16371068]     Ответить | Цитировать Сообщить модератору
 Re: Не понятна логика  [new]
o-o
Guest
Молодой
Не, на самом деле оказался прав gandjustas
ведь помню - говорила мама - пользуй лучше Set а не Select
- Грабли понятны. Вопрос снят

declare @t table (id int)
declare @Id int = 0

set @Id = (select TOP 1   id    FROM @t WHERE  1=2 )
select @Id


а что, если SELECT заюзать, что-то изменится?
declare @t table (id int)
declare @Id int = 0

select @Id = (select TOP 1   id    FROM @t WHERE  1=2 )
select @Id
-----------
(No column name)
NULL
29 июл 14, 13:59    [16371074]     Ответить | Цитировать Сообщить модератору
 Re: Не понятна логика  [new]
Wlr-l
Member

Откуда:
Сообщений: 601
Совсем просто:

declare @Id int; //или так: declare @Id int = null;
select TOP 1     id    FROM @t WHERE  1=2


После выполнения переменная @Id будет иметь значение null
29 июл 14, 14:38    [16371334]     Ответить | Цитировать Сообщить модератору
 Re: Не понятна логика  [new]
Wlr-l
Member

Откуда:
Сообщений: 601
Ошибся, точнее так:

declare @t table (id int)
declare @Id int; //или так: declare @Id int = null;
select TOP 1   @Id = id    FROM @t WHERE  1=2
select @Id
29 июл 14, 14:46    [16371383]     Ответить | Цитировать Сообщить модератору
 Re: Не понятна логика  [new]
Молодой
Member

Откуда: Москва
Сообщений: 180
Wlr-l, последний вариант что Вы прислали и есть первый мой вариант

declare @t table (id int)
declare @Id int = 0
select TOP 1 @Id = id FROM @t WHERE 1=2
select @Id

Суть в том что задача не теоретическая а практическая и
29 июл 14, 14:54    [16371432]     Ответить | Цитировать Сообщить модератору
 Re: Не понятна логика  [new]
Молодой
Member

Откуда: Москва
Сообщений: 180
и запрос
select TOP 1   @Id = id    FROM @t WHERE  1=2

в жизни выглядит гораздо сложнее и where там сложнее и оставить надо именно его.

Все равно - Всем спасибо что разрулили мой клин, ну и Glory как всегда на высоте
29 июл 14, 14:56    [16371455]     Ответить | Цитировать Сообщить модератору
 Re: Не понятна логика  [new]
Wlr-l
Member

Откуда:
Сообщений: 601
еще раз:

"Написавший думал что @Id будет Null на выходе а он оказывается равен 0", потому что у Вас написано:

declare @Id int = 0


Как уже сказали: "SELECT возвращает 0 строк, поэтому присваивание выполняется 0 раз", следовательно, значение переменной @Id в этом случае не изменится и она будет иметь значение 0.

Нужно написать так:

declare @Id int; --или так: declare @Id int = null;


В этом случае переменная @Id будет иметь значение null.

Вас ускользнуло понимание инициализации переменной @Id.

Все в жизни является сложным, но если не работает простой случай, то сложный не будет работать и подавно.
30 июл 14, 13:50    [16376876]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить