2015-10-01 49 views
0

我有這樣的腳本:如何使用光標正確

declare @username nvarchar(255) 
declare @Alterstatement nvarchar(2000) 
declare @userloginname nvarchar(255) 
declare @InsertIntoHistory nvarchar(2000) 

declare getusername cursor 
for 
    select name from [SysAdmin].[dbo].[DisabledAccount] 
     where name in (select name from sys.server_principals) 

open getusername 
Fetch next from getusername into @username 

while @@FETCH_STATUS=0 
begin 
    set @userloginname = '[' + @username + ']'` 

    set @Alterstatement = 'Alter Login' [email protected] +'Disable' 
    set @InsertIntoHistory = 'Insert into DisabledAccountHistory (DisabledName,ServerName) values(''' 
     + @username + ''','''+ @@servername +''')' 
    exec(@alterstatement) 
    exec(@InsertIntoHistory) 
    Fetch next from getusername 
    into @username 
end 

close getusername 
deallocate getusername 

我米使用這個腳本禁用某些用戶並插入到一個歷史表。但是當我運行這個時,出現了一些問題。例如,當我只有一個用戶需要禁用時,它將運行3次,並在歷史記錄表中插入3行。任何人都可以給我一些建議,如何問它每個用戶只運行一次?

非常感謝!

+1

'選擇不同的名稱'以確保您只爲每個用戶獲得1行? –

+0

沒有cuz問題是遊標運行3次,它只是從sys表中取一個名字。 @AlexK。 – Jack

+0

如果這是執行三次,這是因爲[SysAdmin]。[dbo]。[DisabledAccount]中有給定用戶的三行。你也應該使用QUOTENAME而不是試圖在你的值中包裝[]。使用quotename可以正確處理所有的邊界情況。 –

回答

1

我會擺脫光標完全因爲它不需要在這裏。您仍然可以禁用所有登錄並將數據插入到歷史記錄表中。

declare @SQL nvarchar(max) = '' 

select @SQL = @SQL + 'ALTER LOGIN ' + QUOTENAME(name) + ' DISABLE;' 
from [SysAdmin].[dbo].[DisabledAccount] 
where name in (select name from sys.server_principals) 
group by name 

exec sp_executesql @SQL 

Insert into DisabledAccountHistory 
(
    DisabledName 
    , ServerName 
) 
select name 
    , @@servername 
from [SysAdmin].[dbo].[DisabledAccount] 
where name in (select name from sys.server_principals) 
group by name 
+0

太棒了!非常感謝! – Jack