欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

快速刷新视图

程序员文章站 2023-12-20 14:22:04
DECLARE @tableNames varchar(500)SET @tableNames='xxx,DB2, ' -- 关键此处填写需要刷新视图的数据库名称 DECLARE @i_start intSET @i_start=1; DECLARE @i_end intSET @i_end = C ......


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

上一篇:

下一篇: