循环执行SQL语句怎么写?

baidu_15112559 2015-01-22 04:13:16
表A
ID ,用户名,过期时间
1,csdn,2015-2-22 16:57:57

表大概是这样的结构,其中用户名就是SQL登录用户名,比如默认的sa就是其中一个
我想实现在大于过期日期后禁用对应的用户名。
我想用SQL的作业来设置一个周期执行,比如1天一次,查询到期后执行禁用用户名的操作。
因为我觉得要先查询这个表得到若干到期的用户名,然后全部禁用,不熟悉该怎么写。
请问应该怎么写SQL语句?
...全文
533 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
Ginnnnnnnn 2015-02-06
  • 打赏
  • 举报
回复
直接拼接一个变量搞定~

CREATE TABLE #Tmp1
(
	[用户名] NVARCHAR(50),
	[过期日期] DATETIME
)


INSERT INTO #Tmp1
        ( 用户名, 过期日期 )
SELECT 'AA','2015-01-01'
UNION ALL
SELECT 'BB','2015-01-02'
UNION ALL
SELECT 'CC','2015-02-02'
UNION ALL
SELECT 'DD','2015-03-02'

DECLARE @Sql NVARCHAR(max)

SELECT @Sql=A.[Sql]
	FROM (SELECT 'EXEC (''ALTER LOGIN  ' + 用户名 + ' DISABLE'');' 
				from #Tmp1 
				where 过期日期<getdate() FOR XML PATH('')) AS A(Sql)

EXEC sys.sp_executesql @Sql
zebro1573 2015-02-06
  • 打赏
  • 举报
回复
一定要while 么,不需要吧
江南小鱼 2015-01-25
  • 打赏
  • 举报
回复
写个存储过程,指定一个Job定期执行即可
create procedure P_DisableUser
begin
    select row_number() over(order by id desc) ID,用户名 Name 
    into #tmp
    from A where expire_dt <= getdate()
    
    declare @count int
    select @count = count(1) from #tmp
    if @count > 0
    begin
        declare @i int
	   ,@Name VARCHAR(50),@sql varchar(200)
        set @i = 1
        while @i <= @count
        begin
   	     select @Name = Name from #tmp where ID = @i
             set @sql ='ALTER LOGIN ' + @Name + ' disable'
    	     exec(@sql)
             set @i = @i + 1
        end
    end
    drop table #tmp
end
无涯大者 2015-01-25
  • 打赏
  • 举报
回复
如上楼写的,对多行记录(即记录集)进行读取操作时,可以使用到游标或WHILE等循环!
hepe00 2015-01-22
  • 打赏
  • 举报
回复
调整:while @@FETCH_STATUS=0 ,手滑了。
hepe00 2015-01-22
  • 打赏
  • 举报
回复

declare @username as varchar(50),@sql varchar(100);

declare Cur cursor fast_forward  --定义只读游标
for
	select 用户名 from A where 过期日期>getdate()
open Cur						--打开
fetch next from Cur into @username  --获取数据到变量@username

while @@FETCH_STATUS==0			--有数据可循环
begin
	select @sql ='ALTER LOGIN '+ @username+' disable'
	exec(@sql)
       fetch next from Cur into @username  --获取下一条
end	
close Cur				--关闭游标
deallocate Cur			--删除游标
hepe00 2015-01-22
  • 打赏
  • 举报
回复

declare @username as varchar(50),@sql varchar(100);

declare Cur cursor fast_forward  --定义只读游标
for
	select 用户名 from A where 过期日期>getdate()
open Cur						--打开
fetch next from Cur into @username  --获取数据到变量@username

while @@FETCH_STATUS==0			--有数据可循环
begin
	select @sql ='ALTER LOGIN '+ @username+' disable'
	exec(@sql)
end	
close Cur				--关闭游标
deallocate Cur			--删除游标

sinat_15112779 2015-01-22
  • 打赏
  • 举报
回复
我不知道SQL怎么循环, 得到所有过期的用户名:
select 用户名 from A where 过期日期>getdate()
但是他不是一个啊,而是大于等于0个, 禁用用户名
ALTER LOGIN sa DISABLE
如果是其他编程语言,我可以用变量和循环,但这个SQL不熟悉,不知道该怎么把他们写在一起,希望好心人指导下,谢谢。
引用 2 楼 hepe00 的回复:
自己有思路了,就去百度谷歌找啊, 别人去找资料写好给你不现实吧。
hepe00 2015-01-22
  • 打赏
  • 举报
回复
自己有思路了,就去百度谷歌找啊, 别人去找资料写好给你不现实吧。
shiyiwan 2015-01-22
  • 打赏
  • 举报
回复
select user_name from t where expire_dt <= getdate();

27,580

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧