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