t sql - 子查询到变量

时间:2012-11-16 21:32:35

标签: sql-server-2008 tsql

我似乎无法弄清楚如何将以下表达式/子查询返回的值加载到变量中:

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因为变量不能为空:

3 个答案:

答案 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作为安全措施 - 这样的操作实际上是在寻找离散值,并且您的查询也应该以这种方式编写。