Jay*_*Jay 2 sql-server cursors
我正在尝试写一个游标。我创建了一个表,用于从 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
Run Code Online (Sandbox Code Playgroud)
我认为由于这一行而产生了错误
If (Select Login from [dbo].[LoginsForDBUserList]) = @log
Run Code Online (Sandbox Code Playgroud)
多行从等号左侧返回,并尝试与单个值进行比较@log
。
我对您原来的查询做了一些调整,它对我有用。尝试一下:
--demo setup
DROP TABLE IF EXISTS LoginsForDBUserList
GO
CREATE TABLE LoginsForDBUserList (
LOGIN VARCHAR(200)
,LastLoginTime DATETIME
)
--Adjustments to your original process
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 EXISTS (
SELECT LOGIN
FROM LoginsForDBUserList
WHERE LOGIN = @log
)
BEGIN
UPDATE LoginsForDBUserList
SET LastLoginTime = @log_time
WHERE [login] = @log
END
ELSE
BEGIN
INSERT INTO LoginsForDBUserList
SELECT login_name
,login_time
FROM sys.dm_exec_sessions
END
FETCH NEXT
FROM LoginsSize
INTO @log
,@log_time
END
CLOSE LoginsSize
DEALLOCATE LoginsSize
SELECT *
FROM LoginsForDBUserList
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
12216 次 |
最近记录: |