TSQL选择变量

vab*_*bii 1 t-sql sql-server

我正在对变量进行简单的"选择"但不能理解第二个片段的输出.

按预期工作:

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
Run Code Online (Sandbox Code Playgroud)

表格表格具有按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
Run Code Online (Sandbox Code Playgroud)

它不应该输出null吗?

谢谢.

Mar*_*ith 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; 
Run Code Online (Sandbox Code Playgroud)