Выберите, который возвращает несколько значений не работает, как ожидалось - PullRequest
0 голосов
/ 07 ноября 2019

Я не могу понять этот select запрос из t-sql - он возвращает несколько значений:

select id from @tbl

id
1
2
3
4
5

По моей логике это должно быть ошибкой:

select @id = id from @tbl

потому что выбрано несколько значений. Но это не ошибка - вместо этого последнее введенное значение выбирается в @id. Итак, @id = 5. Почему это так?

Полный пример здесь:

declare @tbl table
(
  id int
)

insert @tbl (id)
  values(1),(2),(3),(4),(5)

declare @id int
select @id = id from @tbl

select @id

Ответы [ 2 ]

3 голосов
/ 07 ноября 2019

«Почему» на вопросы трудно ответить , потому что мы не знаем точно, что вы ищете. Один ответ приходит из документации для выполнения SELECT в локальной переменной. Это говорит:

SELECT @local_variable обычно используется для возврата одного значения в переменную. Однако, когда выражением является имя столбца, оно может возвращать несколько значений. Если инструкция SELECT возвращает более одного значения, переменной присваивается последнее возвращенное значение.

Если инструкция SELECT не возвращает строк, переменная сохраняет свое текущее значение. Если выражение является скалярным подзапросом, который не возвращает значения, переменная устанавливается в NULL.

Так что в основном это работает так, потому что это то, для чего предназначен механизм T-SQL. Если возвращение нескольких значений должно быть ошибкой в ​​вашем контексте, вы можете проверить @@ ROWCOUNT = 1. Если это false, вы можете выдать ошибку.

0 голосов
/ 07 ноября 2019
While executing the "select id from @tbl"

The column values are physically stored inside the disk. So it fetch all the values,
but declaring variables is scope to the session so its works on the set based approach.
**SELECT** is *multi-value* attribute and **SET** is *single* value attribute.

This applicable to all relational database systems.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...