2015-08-14 68 views
1

我正在做一個簡單的'選擇'成一個變量,但無法理解第二個片段的輸出。TSQL選擇到一個變量

按預期工作:

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 

不應該輸出空嗎?

謝謝。

回答

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;