Estou tentando escrever um cursor. Eu criei uma tabela para capturar o nome de login e a hora de sys.dm_exec_sessions. Agora, preciso escrever um cursor para atualizar o horário de login para o último horário de login se o login já existir e inserir uma linha caso o login não exista na minha tabela. Eu fiz o seguinte, mas infelizmente estou recebendo um erro com a subconsulta retornando mais de um valor para ela. Alguma ideia???
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
Acho que esse erro está sendo gerado por causa dessa linha
Várias linhas estão sendo retornadas do lado esquerdo do sinal de igual e estão tentando ser comparadas com o valor único
@log
.Fiz alguns ajustes na sua consulta original e funcionou para mim. Dê uma chance a isso:
@Scott já deu a resposta à sua pergunta. Mas espero que você possa abandonar esse cursor e usar um código baseado em SET aqui.