T-SQL——批量刷新视图
0. 背景说明
为什么要刷新视图?
当修改了表结构,比如说添加了新字段,之前使用过该表的视图则不会展示新的字段。
即使视图中是使用*来获取该表的所有字段,视图也不会获取到表中新添加的字段。(当然也不建议视图中使用*)
简而言之:表结构的更改不会自动的反应到已创建的视图中
因此修改了表结构,需要对使用该表的视图进行刷新,两种方式如下:
使用
EXEC sp_refreshview 'V_XXX';对视图“V_XXX”进行刷新操作,基于原始创建视图的语句,进行
ALTER操作(MSMS右键视图对象Alter到)
但是很多时候,并不能快速直接确定那些视图使用了某个表,所以需要查询出依赖该表的所有视图
1. 查询出所有使用了指定表的视图并生成刷新语句
脚本逻辑:使用内置的视图:sys.sql_dependencies
该视图可以查询对象的依赖关系,该系统视图支持2005~2016
也可以使用新的依赖查询视图:sys.sql_expression_dependencies(2008版本及之后)
注意这里个视图的作用差不多,但是字段名称不一样。
- 使用
sys.sql_dependencies
SELECT DISTINCT
'EXEC sp_refreshview ''' + name + ''''
FROM sys.objects so
INNER JOIN sys.sql_dependencies sd
ON so.object_id = sd.object_id
WHERE type = 'V'
AND sd.referenced_major_id = OBJECT_ID(N'tb');
- 使用
sys.sql_expression_dependencies
--查询使用了表tbXXX的所有视图并生成刷新语句
SELECT DISTINCT
'EXEC sp_refreshview ''' + name + ''''
FROM sys.objects so
INNER JOIN sys.sql_expression_dependencies sd
ON so.object_id = sd.referencing_id
WHERE type = 'V'
AND sd.referenced_id = OBJECT_ID(N'tbXXX');
结果格式如下,比如说这里有两个视图使用了tbXXX,则生成两条sql语句如下
EXEC sp_refreshview 'V_XXX1'
EXEC sp_refreshview 'V_XXX2'
注意:建议使用以上脚本生成刷新语句复制出来,手动执行刷新操作,这样可以明确自己执行的每一条sql语句
2. 创建存储过程批量刷新
脚本逻辑:使用内置视图查询依赖指定的表的所有视图,然后使用游标,将查询到的视图一条一条的执行刷新操作
-- =============================================
-- Author:
-- Create date: 2023年5月16日
-- Description: 参数是表名,用于刷新使用了该表的所有视图
-- =============================================
CREATE PROCEDURE [dbo].[pro_RefreshView] @table_name NVARCHAR(200)
AS
BEGIN
DECLARE MyCursor CURSOR FOR
SELECT OBJECT_NAME(referencing_id) AS referencing_entity_name
FROM sys.sql_expression_dependencies AS sed
INNER JOIN sys.objects AS o
ON sed.referencing_id = o.object_id
WHERE referenced_id = OBJECT_ID(N'' + @table_name + '')
AND o.type_desc = 'VIEW';
DECLARE @view_name VARCHAR(40);
OPEN MyCursor;
FETCH NEXT FROM MyCursor
INTO @view_name;
WHILE (@@fetch_status <> -1)
BEGIN
IF (@@fetch_status <> -2)
BEGIN
PRINT @view_name;--打印出操作的视图名称
EXEC sp_refreshview @view_name;
END;
FETCH NEXT FROM MyCursor
INTO @view_name;
END;
CLOSE MyCursor;
DEALLOCATE MyCursor;
END;
GO
使用该存储过程对使用了表tbXXX的所有视图进行刷新
EXEC dbo.pro_RefreshView @table_name = N'tb' -- nvarchar(200)
3. 刷新全部的视图
脚本逻辑:与上述一样,使用系统内置的对象视图,查询出所有的视图多像,使用游标逐个进行刷新
DECLARE @ViewName VARCHAR(250);
DECLARE @i INT;
SET @i = 0;
DECLARE #_cursor CURSOR FOR SELECT name FROM sys.sysobjects WHERE type = 'V';
OPEN #_cursor;
FETCH NEXT FROM #_cursor
INTO @ViewName;
WHILE @@fetch_status = 0
BEGIN
PRINT '成功刷新视图: ' + @ViewName;
EXEC sp_refreshview @ViewName;
SET @i = @i + 1;
FETCH NEXT FROM #_cursor
INTO @ViewName;
END;
CLOSE #_cursor;
DEALLOCATE #_cursor;
PRINT '完成';
PRINT '共成功刷新' + CONVERT(VARCHAR(10), @i) + '个视图';
4. 参考
-
- 该文详细的说明的sql server中的对象的依赖关系的查询
T-SQL——批量刷新视图的更多相关文章
- 刷新SQL Server所有视图、函数、存储过程
刷新SQL Server所有视图.函数.存储过程 更多 sql 此脚本用于在删除或添加字段时刷新相关视图,并检查视图.函数.存储过程有效性. [SQL]代码 --视图.存储过程.函数名称 DE ...
- 刷新SQL Server所有视图、函数、存储过程 更多 sql 此脚本用于在删除或添加字段时刷新相关视图,并检查视图、函数、存储过程有效性。 [SQL]代码 --视图、存储过程、函数名称 DECLARE @NAME NVARCHAR(255); --局部游标 DECLARE @CUR CURSOR --自动修改未上状态为旷课 SET @CUR=CURSOR SCROLL DYNAMIC FO
刷新SQL Server所有视图.函数.存储过程 更多 sql 此脚本用于在删除或添加字段时刷新相关视图,并检查视图.函数.存储过程有效性. [SQL]代码 --视图.存储过程.函数名称 DE ...
- 金蝶KIS&K3助记码SQL数据库批量刷新
金蝶KIS&K3助记码SQL数据库批量刷新 用的次数不多,就没有写入存储过程或者触发里面了,可以自行实现. 第一步选择对应账套的数据库,执行下面的命令,这个是一个函数. go if exist ...
- (MSSQL)sp_refreshview刷新视图失败及更新Table字段失败的问题解决
在近期工作中遇到一个任务,需要批量更改散布在很多Table中的某字段,同时刷新相关视图,但是在执行脚本时,发现了如下问题 更新字段问题 消息 ,级别 ,状态 ,第 行 对象'View_Simple' ...
- ORACLE 10g、11g批量刷新用户密码
一.ORACLE 10g批量刷新用户密码 select 'alter user ' || username ||' identified by values '''||password ||''';' ...
- SQL批量更新数据库中所有用户数据表中字段类型为tinyint为int
--SQL批量更新数据库中所有用户数据表中字段类型为tinyint为int --关键说明:--1.从系统表syscolumns中的查询所有xtype='48'的记录得到类型为[tinyint]的字段- ...
- SQL批量添加主键脚本
--SQL批量添加主键脚本 --操作提示:运行此脚本前请记得备份您要操作的数据库 --实现功能:执行脚本后数据库中的所有数据表都会有一个主键 --添加规则1:主键名称为ID(可自己修改),数据类型为整 ...
- 利用sql批量删除表,存储过程
利用sql批量删除表,存储过程. 最近用godaddy的空间,由于系统里面的表多,一个个的删除很麻烦,就网上搜集了一下解决方法. 给大家分享一下: 1.批量删除存储过程 declare @procNa ...
- SQL Server 系统视图
SQL Server系统视图非常的多,因此不可能一个一个地写,我最近一直在想,对于数据库的系统视图应该如何学,但是看了一下目录之后,我呆了,我觉得每个写一次,可能都要花费1个星期的时间,如果对每一个返 ...
- IOS如何刷新视图上的显示内容
大家都知道,UItableView 有个 reloadData的方法,可以tableview刷新视图.而普通的View上面.我们如何刷新视图的呢? 下图是我做的一个用户登录之后显示用户昵称和个性签名还 ...
随机推荐
- sql处理重复的列,更好理清分组和分区
一.分组统计.分区排名 1.语法和含义: 如果查询结果看得有疑惑,看第二部分-sql处理重复的列,更好理清分组和分区,有建表插入数据的sql语句 分组统计:GROUP BY 结合 统计/聚合函数一起使 ...
- 65.C++的输入流和输出流
1.流的概念和流类库的结构 程序的输入指的是从输入文件将数据传送给程序,程序的输出指的是从程序将数据传送给输出文件. C++输入输出包含以下三个方面的内容: 对系统指定的标准设备的输入和输 ...
- Asp-Net-Core开发笔记:使用RateLimit中间件实现接口限流
前言 最近一直在忙(2月份沉迷steam,3月开始工作各种忙),好久没更新博客了,不过也积累了一些,忙里偷闲记录一下. 这个需求是这样的,我之前做了个工单系统,现在要对登录.注册.发起工单这些功能做限 ...
- 【备忘录】 主定理 Master Theorem (转载)
备忘录 https://zhuanlan.zhihu.com/p/113406812
- ThreadPool实现机制
Android中阻塞队列的应用有哪些 阻塞队列在 Android 中有很多应用,比如: 线程池:线程池任务的执行就是基于一个阻塞队列,如果线程池任务已满,则任务需要等待阻塞队列中的其他任务完成. Ha ...
- Java面试——锁
公平锁:是指多个线程按照申请锁的顺序来获取锁,有点先来后到的意思.在并发环境中,每个线程在获取锁时会先查看此锁维护的队列,如果为空,或者当前线程是等待队列的第一个,就占有锁,否则就会加入到等待队列中, ...
- 如何在Java中做基准测试?JMH使用初体验
大家好,我是王有志,欢迎和我聊技术,聊漂泊在外的生活.快来加入我们的Java提桶跑路群:共同富裕的Java人. 最近公司在搞新项目,由于是实验性质,且不会直接面对客户的项目,这次的技术选型非常激进,如 ...
- 【HALF】CSP-S2 2022 游记 - Dawn Eve?
相册放在 NOIP2022 游记 了 Day -2 周三.折腾了好几天,考场从深圳换到广州最后换到东莞.疫情爆炸... 只是希望自己最后两场比赛不会受到影响. 下午是高二体锻课,结果我们得去做核酸.四 ...
- FFmpeg开发笔记(一)搭建Linux系统的开发环境
对于初学者来说,如何搭建FFmpeg的开发环境是个不小的拦路虎,因为FFmpeg用到了许多第三方开发包,所以要先编译这些第三方源码,之后才能给FFmpeg集成编译好的第三方库.不过考虑到刚开始仅仅调用 ...
- Redis的缓存穿透+解决方案
1.缓存穿透现象介绍 缓存穿透 :缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库. 常见的解决方案有两种: 缓存空对象 优点:实现简单,维护方便 ...