我正在做一个简单的选择'变量但不能理解第二个片段的输出。
按预期工作:
declare @tname as varchar(100) = 'F99Special_DMT';
select top(1) @tname = form_name
from [dbo].[forms]
where form_name > @tname
print @tname; -- output = F99Special_Physical
表单表格具有按form_name排序的行。 F99Special_Physical是最后一行的值。
declare @tname as varchar(100) = 'F99Special_Physical';
select top(1) @tname = form_name
from [dbo].[forms]
where form_name > @tname
print @tname; -- output = F99Special_Physical
不应该输出null吗?
感谢。
答案 0 :(得分:5)
不。如果基础SELECT
返回零行(当使用>
最大值时会发生),则不进行任何分配,并保留变量的初始值。
您可以使用@@rowcount
来检查此内容。
如果order by
之前多行匹配,则需要top
才能获得确定性结果。
DECLARE @tname AS VARCHAR(100) = 'F99Special_DMT';
SELECT TOP(1) @tname = form_name
FROM [dbo].[forms]
WHERE form_name > @tname
ORDER BY form_name;
PRINT CASE
WHEN @@ROWCOUNT = 1
THEN @tname
END;