SQL Server 标量变量仅保存表结果中的最后一个值,而不是抛出错误

问题描述 投票:0回答:1

我有一个源表,我认为它的表只存储一个不同的时期。我将该句点分配给一个 int 变量,如下所示。

SET NOCOUNT ON;
DECLARE @tarih INT;
------------
SELECT @tarih = Dates
FROM
(
    SELECT DISTINCT 
           [Period] AS Dates
    FROM MySourceTable STG WITH(NOLOCK)
) a

但是有一天我偶然注意到该表可以返回多个值。在这种情况下,我预计 SQL Server 会抛出错误。相反,它仅采用表集中的最后一个值。

当我像下面这样更改代码时,它会抛出一个错误,正如我所期望的那样。

DECLARE @tarih INT;
------------
SELECT @tarih = 
(
    SELECT DISTINCT 
           [Period]
    FROM MySourceTable STG WITH(NOLOCK)
) 

子查询返回超过 1 个值。这是不允许的,当 子查询跟在 =、!=、<, <= , >、>= 后面或当子查询用作 一个表情。

这两种语法有什么区别?第一个查询不应该也会出错吗?他们在后台的工作方式不同吗?

sql-server error-handling declare scalar-subquery
1个回答
0
投票

此行为记录在变量 (Transact-SQL) 页面:

如果 SELECT 语句返回多行并且变量引用非标量表达式,则该变量将设置为结果集最后一行中表达式返回的值。

子查询的规则是不同的 - 如果与集合运算符(例如

in
exists
any
等)或表别名(作为
from
的一部分)一起使用,子查询可以返回多个值或
apply
子句`。

当子查询用作表达式或在标量运算符之后使用时,它必须返回单个标量值,如问题中引用的错误消息中所指定。
有关更多信息,请阅读有关 子查询类型的文档。

© www.soinside.com 2019 - 2024. All rights reserved.