我正在尝试写一个游标。我创建了一个用于从 sys.dm_exec_sessions 捕获登录名和时间的表。现在,如果登录已经存在,我需要编写一个游标来将登录时间更新为上次登录时间,并在我的表中不存在登录的情况下插入一行。我想出了以下方法,但不幸的是,子查询返回多个值时出现错误。有任何想法吗???
declare @log as varchar(200)
declare @log_time as datetime
declare LoginsSize cursor for
SELECT login_name, login_time
FROM sys.dm_exec_sessions
open LoginsSize
fetch next from LoginsSize into @log, @log_time
while( @@fetch_status = 0)
begin
If (Select Login from [dbo].[LoginsForDBUserList]) = @log
Begin
UPDATE [dbo].[LoginsForDBUserList]
SET LastLoginTime = @log_time
WHERE [login]= @log
END
Else
Begin
Insert Into [dbo].[LoginsForDBUserList]
SELECT login_name, login_time
FROM sys.dm_exec_sessions
END
fetch next from LoginsSize into @log, @log_time
close LoginsSize
deallocate LoginsSize
end
我认为由于这条线而产生了错误
多行从等号左侧返回,并试图与单个值进行比较
@log
。我对您的原始查询进行了一些调整,它对我有用。试试这个:
@Scott 已经回答了你的问题。但我希望您可以放弃该光标并在此处使用基于 SET 的代码。