0

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

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变量时在我的存储过程中仍然为空。这意味着这仍然不起作用。稍后在我使用的代码中:

t.col_three = @var

此外,我没有使用t.col_three = @var or @var is null,因为变量不能为空:

4

3 回答 3

3

尝试将查询更改为以下内容。我将在不使用子查询的情况下实现您的需求,并且与您的查询不同,它将始终返回最多 1 个结果。

Select Top 1 @var = t.col_one
From my_table t
Where t.col_two = 1
Order By t.t_datetime Desc
于 2012-11-16T22:17:56.100 回答
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)

看看它是否抛出错误。

于 2012-11-16T21:34:34.387 回答
0

只要您的查询只返回一行,SET 或 SELECT 都可以正常工作。您可以使用诸如 MAX 之类的聚合函数来确保只有一行,或者您可以使用 SELECT TOP 1 来确保只返回一行。但是,如果您确实使用 TOP 1,请注意也以一种可以为您提供所需行的方式对查询进行排序。

以这种方式设置变量时,我更喜欢将 TOP 1 仅用作保护措施——这样的操作实际上是在寻找离散值,并且您的查询也应该以这种方式编写。

于 2012-11-16T21:44:14.977 回答