我似乎无法弄清楚如何将以下表达式/子查询返回的值加载到变量中:
declare @var int
set @var = null
IF @var IS NULL
SELECT @var = t.col_one
FROM my_table t
WHERE t_datetime = (SELECT MAX(t_datetime) FROM t WHERE t.col_two = 1)
如何将表达式的结果加载到变量?
我已更新代码以反映下面的答案,但问题仍然存在。没有错误,但是当我调用@var
时,我的sproc中的变量仍为空。这意味着这仍然无效。稍后在我正在使用的代码中:
t.col_three = @var
此外,我没有使用t.col_three = @var or @var is null
因为变量不能为空:
答案 0 :(得分:3)
尝试将查询更改为以下内容。我将在不使用子查询的情况下实现您的需求,并且与查询不同,它将始终返回最多1个结果。
Select Top 1 @var = t.col_one
From my_table t
Where t.col_two = 1
Order By t.t_datetime Desc
答案 1 :(得分:1)
尝试
SELECT @var = table.col from table ...
还要确保查询只返回一行。
例如,在查询之前添加类似的内容:
DECLARE @count INT
SELECT @count = COUNT(*) FROM t WHERE t.col_two = 1
IF (@count = 0) RAISERROR('no rows found',16,1)
并查看是否会引发错误。
答案 2 :(得分:0)
只要您的查询只返回一行,SET或SELECT就可以正常工作。您可以使用MAX等聚合函数来确保只有一行,或者您可以选择SELECT TOP 1以确保只返回一行。但是,如果您确实使用了TOP 1,请注意以一种为您提供所需行的方式对您的查询进行排序。
当以这种方式设置变量时,我更喜欢仅使用TOP 1作为安全措施 - 这样的操作实际上是在寻找离散值,并且您的查询也应该以这种方式编写。