powered by simpleCommunicator - 2.0.48     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Результат запроса (N строк) в скалярную переменную
20 сообщений из 20, страница 1 из 1
Результат запроса (N строк) в скалярную переменную
    #39199017
mezzanine
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго дня.

Довольно неожиданно для меня было то что запрос который возвращает больше одной записи нормально работает со скалярной переменной. Просто по опыту в Оракле в таком случае сервер генерирует логичную ошибку: TOO_MANY_ROWS You tried to execute a SELECT INTO statement and more than one row was returned.
Такие ошибки искать просто жуть как трудно. Ожидаешь одну запись, потом что-то поменялась в данных и запрос ошибочно возвращает 2 записи.
Может в MS так тоже можно сделать? Не проверяя "ручками" результаты запроса и генерируя собственный эксепшен.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
DECLARE @int INT;

WITH cte
AS (SELECT 1 id
UNION ALL
SELECT 2 id)
SELECT @int = id
  FROM cte

SELECT @int;
...
Рейтинг: 0 / 0
Результат запроса (N строк) в скалярную переменную
    #39199023
o-o
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
o-o
Гость
SELECT @local_variable (Transact-SQL)
BOLSELECT @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 .
в явном виде сказано, что не будет ошибки,
и не вернет никакую кучу значений,
а вернет последнее обработанное.
не нравится такое поведение, не используйте переменную.
я такое использую, когда мне надо весь офигительный запрос прогнать,
получить план с реальными цифрами и временем,
но гнать результат на клиент мне не надо
и вставлять куда-то тоже не желаю
...
Рейтинг: 0 / 0
Результат запроса (N строк) в скалярную переменную
    #39199024
AlanDenton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Присваивать можно по разному...

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
DECLARE @int INT

SET @int = (
    SELECT id
    FROM (
        VALUES (1), (2)
    ) t(id)
)

SELECT @int


и выбирают люди так как им будет удобно.
...
Рейтинг: 0 / 0
Результат запроса (N строк) в скалярную переменную
    #39199028
mezzanine
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AlanDenton,

Огромное спасибо! То что доктор прописал.
...
Рейтинг: 0 / 0
Результат запроса (N строк) в скалярную переменную
    #39199034
AlanDenton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
К слову будет сказано, начиная с 2008 сервера можно совмещать объявление переменной и ее инициализацию:

Код: sql
1.
2.
3.
4.
5.
6.
DECLARE @int INT = (
    SELECT id
    FROM (
        VALUES (1), (2)
    ) t(id)
)
...
Рейтинг: 0 / 0
Результат запроса (N строк) в скалярную переменную
    #39199036
mezzanine
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AlanDenton,

В такой способ можно присвоить значение больше чем одной переменной?
...
Рейтинг: 0 / 0
Результат запроса (N строк) в скалярную переменную
    #39199040
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mezzanineAlanDenton,

В такой способ можно присвоить значение больше чем одной переменной?Всё так же, как и с SET
...
Рейтинг: 0 / 0
Результат запроса (N строк) в скалярную переменную
    #39199044
mezzanine
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
iap,

Например, как одним запросом получить значение полей id1, id2 ?
Код: sql
1.
2.
3.
4.
5.
6.
DECLARE @int INT

SET @int = (SELECT t.id1
  FROM (VALUES (1, 11)) t (id1, id2))

SELECT @int
...
Рейтинг: 0 / 0
Результат запроса (N строк) в скалярную переменную
    #39199048
AlanDenton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот несколько вариантов для Вашего первоначального условия:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
DECLARE
    @i1 INT,
    @i2 INT 

SELECT
    @i1 = id1,
    @i2 = id2
FROM (
    VALUES (1,1), (2,1)
) t(id1, id2)

IF @@rowcount > 1
    RAISERROR('err', 16, 1)


либо уповать на лишние логические чтения из одной и той же таблицы:

Код: sql
1.
2.
3.
4.
5.
6.
DECLARE
    @i1 INT,
    @i2 INT 

SET @i1 = (SELECT ...)
SET @i2 = (SELECT ...)
...
Рейтинг: 0 / 0
Результат запроса (N строк) в скалярную переменную
    #39199050
o-o
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
o-o
Гость
mezzanineiap,

Например, как одним запросом получить значение полей id1, id2 ?
Код: sql
1.
2.
3.
4.
5.
6.
DECLARE @int INT

SET @int = (SELECT t.id1
  FROM (VALUES (1, 11)) t (id1, id2))

SELECT @int


переменная это вам не автобус, где указано 54 сидячих места,
а по факту можно сотню человек штабелями уложить
...
Рейтинг: 0 / 0
Результат запроса (N строк) в скалярную переменную
    #39199053
mezzanine
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AlanDenton,

Еще раз спасибо. Буду использовать 2 опции. Ваш вариант с одной переменной, ну и где нужно больше одной переменной то генерировать исключение.
...
Рейтинг: 0 / 0
Результат запроса (N строк) в скалярную переменную
    #39199054
mezzanine
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
o-o,

В Оракле более прозрачно в таких вещах:
1. SELECT INTO только скалярные переменные, больше 1 строки ошибка.
2. SELECT INTO BULK COLLECT только табличные переменные, 0-N строк без ошибок
...
Рейтинг: 0 / 0
Результат запроса (N строк) в скалярную переменную
    #39199055
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlanDentonлибо уповать на лишние логические чтения из одной и той же таблицы:

Код: sql
1.
2.
3.
4.
5.
6.
DECLARE
    @i1 INT,
    @i2 INT 

SET @i1 = (SELECT ...)
SET @i2 = (SELECT ...)

Лишние чтения еще ладно. Таким способом можно и несогласованные данные получить.
...
Рейтинг: 0 / 0
Результат запроса (N строк) в скалярную переменную
    #39199320
Фотография Maxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чет я не понял юмора топика ..

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
select @@VERSION

DECLARE @int INT = (
    SELECT id
    FROM (
        VALUES (1), (2)
    ) t(id)
)
select @int

Results :
 
Microsoft SQL Server 2012 (SP1) - 11.0.3460.0 (X64) 
	Jul 22 2014 15:22:00 
	Copyright (c) Microsoft Corporation
	Enterprise Edition: Core-based Licensing (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)
NULL
Messages :

(1 row(s) affected)
Msg 512, Level 16, State 1, Line 3
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

(1 row(s) affected)
...
Рейтинг: 0 / 0
Результат запроса (N строк) в скалярную переменную
    #39199335
AlanDenton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Maxx чет я не понял юмора топика
Если коротко, то спрашивали как через SELECT присваивание рейсить ошибку, когда возвращается более 1 строки.
...
Рейтинг: 0 / 0
Результат запроса (N строк) в скалярную переменную
    #39199357
Фотография Maxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlanDentonЕсли коротко, то спрашивали как через SELECT присваивание рейсить ошибку
мда господа знают толк в извращениях...
...
Рейтинг: 0 / 0
Результат запроса (N строк) в скалярную переменную
    #39199368
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlanDentonкак через SELECT присваивание рейсить ошибку, когда возвращается более 1 строки.
Код: sql
1.
2.
3.
4.
5.
6.
declare @v1 ..., ..., @vN ..., @dummy int;

select
 @v1 = ..., ..., @vN = ..., @dummy = 1 / case when count(*) over() > 1 then 0 end
from
 ...
...
Рейтинг: 0 / 0
Результат запроса (N строк) в скалярную переменную
    #39199370
AlanDenton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Maxxмда господа знают толк в извращениях...
Это еще мелочи :) мне в том году клиент просил прикрутить к рассылке через Database Mail генерацию XLS файлов по 20-30 метров (+ еще ячейки разукрашивать, чтобы на айфоне было красиво смотреть) и в довесок в теле письма генерировать произвольные графики. Вот то было истинным извращением :)
...
Рейтинг: 0 / 0
Результат запроса (N строк) в скалярную переменную
    #39199537
o-o
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
o-o
Гость
AlanDentonMaxxмда господа знают толк в извращениях...
Это еще мелочи :) мне в том году клиент просил прикрутить к рассылке через Database Mail генерацию XLS файлов по 20-30 метров (+ еще ячейки разукрашивать, чтобы на айфоне было красиво смотреть) и в довесок в теле письма генерировать произвольные графики. Вот то было истинным извращением :)
а давайте откроем топик извращений и будем туда постить
самые крутые хотелки или самые дебильные реализации.
а то иногда беспросветное

и нет выхода из этого дерьмантина,
и объяснять им бесполезно,
и вот с кем еще поделиться, чтобы оценили изврат?
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Результат запроса (N строк) в скалярную переменную
    #40132600
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
для ораклиста несколько неожиданно такое поведение - как в стартовом посте
именно что неожиданно - из-за угла бабах! и выбрал сразу 5 значений в одно скалярное



оно конечно потом понятно, когда узнаешь
но на подсознании оракловый опыт иногда мешает
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Результат запроса (N строк) в скалярную переменную
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]