我有一个源表,我认为它的表只存储一个不同的时期。我将该句点分配给一个 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 个值。这是不允许的,当 子查询跟在 =、!=、<, <= , >、>= 后面或当子查询用作 一个表情。
这两种语法有什么区别?第一个查询不应该也会出错吗?他们在后台的工作方式不同吗?
此行为记录在变量 (Transact-SQL) 页面:
如果 SELECT 语句返回多行并且变量引用非标量表达式,则该变量将设置为结果集最后一行中表达式返回的值。
子查询的规则是不同的 - 如果与集合运算符(例如
in
、exists
、any
等)或表别名(作为 from
的一部分)一起使用,子查询可以返回多个值或 apply
子句`。
当子查询用作表达式或在标量运算符之后使用时,它必须返回单个标量值,如问题中引用的错误消息中所指定。
有关更多信息,请阅读有关 子查询类型的文档。