1 DECLARE @TotalCount INT = 0,
2 @NowCount INT = 0,
3 @v_Name NVARCHAR(300) = N'',
4 @v_Des NVARCHAR(max) = N'';
5 --创建临时表
6 CREATE TABLE #Refresh_View
7 ( ID INT IDENTITY(1, 1),
8 v_Name NVARCHAR(300),
9 v_Des NVARCHAR(max),
10 PRIMARY KEY (ID));
11 INSERT INTO #Refresh_View
12
13 SELECT
14 OBJECT_NAME(sm.object_id) AS v_Name ,
15 sm.definition AS v_Des
16 FROM sys.sql_modules AS sm
17 JOIN sys.objects AS o ON sm.object_id = o.object_id
18 WHERE o.type='V'
19
20 SELECT @TotalCount = COUNT(*) FROM #Refresh_View;
21 SET @NowCount = 1;
22 --循环所有视图并替换视图中某些字段
23 WHILE (@NowCount <= @TotalCount)
24 BEGIN
25 BEGIN TRY
26 SELECT @v_Name = v_Name,
27 @v_Des = v_Des
28 FROM #Refresh_View
29 WHERE ID = @NowCount;
30 --EXEC sp_refreshview @v_Name;
31 UPDATE #Refresh_View SET v_Des = replace (v_Des,'被修改字段','修改为的字段') where id=@NowCount
32 SELECT @v_Name = v_Name,
33 @v_Des = v_Des
34 FROM #Refresh_View
35 WHERE ID = @NowCount;
36 PRINT '视图' + @v_Name + '替换成功';
37 exec('drop view '+@v_Name)
38 exec(@v_Des)
39 END TRY
40 BEGIN CATCH
41 PRINT '视图' + @v_Name + '替换失败';
42 select @v_Name as [view], ERROR_MESSAGE() as msg
43 END CATCH;
44 SET @NowCount=@NowCount+1;
45 END;
46
47 --删除临时表
48 IF EXISTS (SELECT * FROM tempdb.dbo.sysobjects WHERE id = OBJECT_ID(N'tempdb..#Refresh_View')AND type = 'U')
49 BEGIN
50 DROP TABLE #Refresh_View;
51 END;