当前位置: 移动技术网 > IT编程>数据库>MSSQL > 快速刷新视图

快速刷新视图

2018年08月23日  | 移动技术网IT编程  | 我要评论

浙江省瑞安市仙降镇,平果,决胜终端


declare @tablenames varchar(500)
set @tablenames='xxx,db2, '   -- 关键此处填写需要刷新视图的数据库名称

declare @i_start int
set @i_start=1;

declare @i_end int
set @i_end = charindex(',', @tablenames, @i_start);

declare @tablename varchar(30)

declare @s nvarchar(1000) -- 注意此处改为nvarchar(1000)

while @i_end>0
begin
  set @tablename= ltrim(rtrim(substring(@tablenames, @i_start, @i_end-@i_start)))
  --select @tablename

  if exists(select * from master..sysdatabases where name=@tablename)
  begin
    print '更新 数据库['+ @tablename+']所有视图'

    if exists (select * from tempdb.dbo.sysobjects where id = object_id(n'tempdb..#temptable') and type='u')
    begin
      drop table #temptable
    end
    create table #temptable (_sql_ nvarchar(1000))

    set @s = 'use '+@tablename+' select ''use '+@tablename+ ' execute sp_refreshview '' + name from sysobjects where [xtype]=''v'''
    insert into #temptable(_sql_)
    exec sp_executesql @s

    ---游标循环遍历--
    declare @temp nvarchar(1000)

    --声明游标
    declare order_cursor cursor

    for(select * from #temptable)
    --打开游标--
    open order_cursor
    --开始循环游标变量--
    fetch next from order_cursor into @temp
    while @@fetch_status = 0 --返回被 fetch语句执行的最后游标的状态--
    begin
      --print @temp
      exec (@temp) --ok
      --exec sp_executesql @temp --ok

      fetch next from order_cursor into @temp --转到下一个游标,没有会死循环
    end

    close order_cursor --关闭游标
    deallocate order_cursor --释放游标

    --用完之后要把临时表清空
    drop table #temptable--需要注意的是,这种方法不能嵌套。

  end

  set @i_start = @i_end + 1;
  set @i_end = charindex(',', @tablenames, @i_start);

end

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网