选择哪个返回多个值不能按预期工作

时间:2019-11-07 00:36:24

标签: sql-server tsql

我无法理解来自t-sql的此select查询-它返回多个值:

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 个答案:

答案 0 :(得分:3)

“为什么”的问题是difficult to answer,因为我们不确定您要查找的是什么。一个答案来自documentation,用于将SELECT执行到局部变量中。那说:

  

SELECT @local_variable通常用于将单个值返回到   变量。但是,当expression是列的名称时,它可以   返回多个值。如果SELECT语句返回多个   值,则为变量分配返回的最后一个值。

     

如果SELECT语句不返回任何行,则变量保留其   目前的价值。如果expression是返回否的标量子查询   值,则将变量设置为NULL。

所以基本上它是这样工作的,因为这就是T-SQL引擎的设计目的。如果返回多个值在您的上下文中应该是错误,则可以检查@@ ROWCOUNT =1。如果为假,则可以引发错误。

答案 1 :(得分:0)

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.