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

Откуда:
Сообщений: 1195
Всегда думал, что такие запросы выбросят исключение.
Ан нет.
DECLARE @ObjectId int;
SELECT @ObjectId = object_id FROM sys.objects ORDER BY object_id
SELECT @ObjectId
SELECT @ObjectId = object_id FROM sys.objects ORDER BY object_id DESC
SELECT @ObjectId
12 дек 16, 14:22    [19993477]     Ответить | Цитировать Сообщить модератору
 Re: SELECT @variable FROM <many rows>  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Jovanny,

чёйта?
12 дек 16, 14:25    [19993495]     Ответить | Цитировать Сообщить модератору
 Re: SELECT @variable FROM <many rows>  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
Jovanny,

угу. а еще вот:
DECLARE @ObjectId int;
set @ObjectId = 777;
SELECT @ObjectId = object_id FROM sys.objects where 1 = 0;
select @ObjectId

поэтому, после такого запроса проверяем @@rowcount. ну, или записываем по-другому:
set @ObjectId = (select object_id from sys.objects);
12 дек 16, 14:38    [19993558]     Ответить | Цитировать Сообщить модератору
 Re: SELECT @variable FROM <many rows>  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37050
Выдадут вот такие:
DECLARE @ObjectId int;
SELECT @ObjectId = ( select top 100 percent object_id FROM sys.objects ORDER BY object_id )
12 дек 16, 14:39    [19993570]     Ответить | Цитировать Сообщить модератору
 Re: SELECT @variable FROM <many rows>  [new]
invm
Member

Откуда: Москва
Сообщений: 9396
Это документировано
https://msdn.microsoft.com/en-us/library/ms187330.aspx
SELECT @local_variable is typically used to return a single value into the variable. However, when expression is the name of a column, it can return multiple values. If the SELECT statement returns more than one value, the variable is assigned the last value that is returned.
12 дек 16, 14:57    [19993688]     Ответить | Цитировать Сообщить модератору
 Re: SELECT @variable FROM <many rows>  [new]
Jovanny
Member

Откуда:
Сообщений: 1195
Как-то некрасиво, что присваивается последнее значение из результата.
А при отсутствии сортировки и вовсе непредсказуемое.
12 дек 16, 14:58    [19993700]     Ответить | Цитировать Сообщить модератору
 Re: SELECT @variable FROM <many rows>  [new]
uaggster
Member

Откуда:
Сообщений: 853
Jovanny, это ж документированное, и, кстати, логичное поведение.
В чем проблема то?
12 дек 16, 15:15    [19993827]     Ответить | Цитировать Сообщить модератору
 Re: SELECT @variable FROM <many rows>  [new]
uaggster
Member

Откуда:
Сообщений: 853
Jovanny
Как-то некрасиво, что присваивается последнее значение из результата.
А при отсутствии сортировки и вовсе непредсказуемое.

А поведение при "множественном" update Вас не смущает в таком разе?
12 дек 16, 15:17    [19993845]     Ответить | Цитировать Сообщить модератору
 Re: SELECT @variable FROM <many rows>  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
С чего бы там что-то исключать, переменной присваивается значение атрибута каждой выбранной строки. Переменные же не одноразовые
12 дек 16, 15:20    [19993872]     Ответить | Цитировать Сообщить модератору
 Re: SELECT @variable FROM <many rows>  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
uaggster
Jovanny
Как-то некрасиво, что присваивается последнее значение из результата.
А при отсутствии сортировки и вовсе непредсказуемое.

А поведение при "множественном" update Вас не смущает в таком разе?


смущает (да, я в курсе, что это документировано). для merge таки сделали ошибку в этом случае.
12 дек 16, 17:35    [19994607]     Ответить | Цитировать Сообщить модератору
 Re: SELECT @variable FROM <many rows>  [new]
Jovanny
Member

Откуда:
Сообщений: 1195
Проблема в том, что пользователь может упустить из виду, что его запрос стал возвращает не одну строку и присваивать переменным не те значения, которые он ожидает.

Логично было бы выбрасывать исключение, что-то типа 'Query returned more than 1 value'.
Конечно, встречаются ситуации, когда нужно записать в переменную именно последнее значение из запроса,
но почему тогда OUTPUT пишет только в табличные переменные?
Писал бы последнее значение inserted или deleted, если вывод направляется в скалярную переменную.

Да и сам Microsoft скромно рекомендует: 'For assigning variables, we recommend that you use SET @local_variable instead of SELECT @local_variable.'
Если SET для 'assigning variables', то для чего тогда SELECT @local_variable ?
12 дек 16, 17:53    [19994705]     Ответить | Цитировать Сообщить модератору
 Re: SELECT @variable FROM <many rows>  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
daw,

если переменной пытаться присвоить таблицу, то да, ошибка, а если скаляр - то нет, не ошибка.
12 дек 16, 18:03    [19994732]     Ответить | Цитировать Сообщить модератору
 Re: SELECT @variable FROM <many rows>  [new]
invm
Member

Откуда: Москва
Сообщений: 9396
Jovanny
Логично было бы выбрасывать исключение, что-то типа 'Query returned more than 1 value'.
Так и было до появления инструкции SET в SQL Server 2000.
Jovanny
для чего тогда SELECT @local_variable ?
Что бы можно было присваивать значения нескольким переменным одной инструкцией.
12 дек 16, 18:12    [19994761]     Ответить | Цитировать Сообщить модератору
 Re: SELECT @variable FROM <many rows>  [new]
LSV
Member [заблокирован]

Откуда: Киев
Сообщений: 30817
по сабжу: отличная возможность. Идеально для получения списка значений через зпт. :)

select @a = @a+','+MyField
12 дек 16, 18:17    [19994774]     Ответить | Цитировать Сообщить модератору
 Re: SELECT @variable FROM <many rows>  [new]
iap
Member

Откуда: Москва
Сообщений: 46999
invm
до появления инструкции SET в SQL Server 2000
А в более ранних не было?
Что-то не помню...
12 дек 16, 19:31    [19995019]     Ответить | Цитировать Сообщить модератору
 Re: SELECT @variable FROM <many rows>  [new]
invm
Member

Откуда: Москва
Сообщений: 9396
iap
А в более ранних не было?
В 6.5 точно не было. В 7 не помню...
12 дек 16, 20:07    [19995118]     Ответить | Цитировать Сообщить модератору
 Re: SELECT @variable FROM <many rows>  [new]
o-o
Guest
а вроде ж это так удобно использовать,
когда надо засечь время офигительного селекта.
селектишь себе в переменные и засекаешь время выборки,
и получаешь именно время селекта, а не вытаскивание на клиента или записи в таблицу
12 дек 16, 23:13    [19995564]     Ответить | Цитировать Сообщить модератору
 Re: SELECT @variable FROM <many rows>  [new]
Cristiano_Rivaldo
Member

Откуда:
Сообщений: 346
Jovanny
Логично было бы выбрасывать исключение, что-то типа 'Query returned more than 1 value'.


Одна из многих причин почему многие Ораклисты плюются кислотой после перехода на ms sql
13 дек 16, 08:01    [19995896]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить