快速刷新视图

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

(0)
上一篇 2022年3月21日
下一篇 2022年3月21日

相关推荐