shanzm——2023年5月16日

0. 背景说明

为什么要刷新视图?

当修改了表结构,比如说添加了新字段,之前使用过该表的视图则不会展示新的字段。

即使视图中是使用*来获取该表的所有字段,视图也不会获取到表中新添加的字段。(当然也不建议视图中使用*)

简而言之:表结构的更改不会自动的反应到已创建的视图中

因此修改了表结构,需要对使用该表的视图进行刷新,两种方式如下:

  • 使用EXEC sp_refreshview 'V_XXX';对视图“V_XXX”进行刷新操作,

  • 基于原始创建视图的语句,进行ALTER操作(MSMS右键视图对象Alter到)

但是很多时候,并不能快速直接确定那些视图使用了某个表,所以需要查询出依赖该表的所有视图


1. 查询出所有使用了指定表的视图并生成刷新语句

脚本逻辑:使用内置的视图:sys.sql_dependencies

该视图可以查询对象的依赖关系,该系统视图支持2005~2016

也可以使用新的依赖查询视图:sys.sql_expression_dependencies(2008版本及之后)

注意这里个视图的作用差不多,但是字段名称不一样。

  1. 使用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');
  1. 使用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. 参考

T-SQL——批量刷新视图的更多相关文章

  1. 刷新SQL Server所有视图、函数、存储过程

    刷新SQL Server所有视图.函数.存储过程 更多   sql   此脚本用于在删除或添加字段时刷新相关视图,并检查视图.函数.存储过程有效性. [SQL]代码 --视图.存储过程.函数名称 DE ...

  2. 刷新SQL Server所有视图、函数、存储过程 更多 sql 此脚本用于在删除或添加字段时刷新相关视图,并检查视图、函数、存储过程有效性。 [SQL]代码 --视图、存储过程、函数名称 DECLARE @NAME NVARCHAR(255); --局部游标 DECLARE @CUR CURSOR --自动修改未上状态为旷课 SET @CUR=CURSOR SCROLL DYNAMIC FO

    刷新SQL Server所有视图.函数.存储过程 更多   sql   此脚本用于在删除或添加字段时刷新相关视图,并检查视图.函数.存储过程有效性. [SQL]代码 --视图.存储过程.函数名称 DE ...

  3. 金蝶KIS&K3助记码SQL数据库批量刷新

    金蝶KIS&K3助记码SQL数据库批量刷新 用的次数不多,就没有写入存储过程或者触发里面了,可以自行实现. 第一步选择对应账套的数据库,执行下面的命令,这个是一个函数. go if exist ...

  4. (MSSQL)sp_refreshview刷新视图失败及更新Table字段失败的问题解决

    在近期工作中遇到一个任务,需要批量更改散布在很多Table中的某字段,同时刷新相关视图,但是在执行脚本时,发现了如下问题 更新字段问题 消息 ,级别 ,状态 ,第 行 对象'View_Simple' ...

  5. ORACLE 10g、11g批量刷新用户密码

    一.ORACLE 10g批量刷新用户密码 select 'alter user ' || username ||' identified by values '''||password ||''';' ...

  6. SQL批量更新数据库中所有用户数据表中字段类型为tinyint为int

    --SQL批量更新数据库中所有用户数据表中字段类型为tinyint为int --关键说明:--1.从系统表syscolumns中的查询所有xtype='48'的记录得到类型为[tinyint]的字段- ...

  7. SQL批量添加主键脚本

    --SQL批量添加主键脚本 --操作提示:运行此脚本前请记得备份您要操作的数据库 --实现功能:执行脚本后数据库中的所有数据表都会有一个主键 --添加规则1:主键名称为ID(可自己修改),数据类型为整 ...

  8. 利用sql批量删除表,存储过程

    利用sql批量删除表,存储过程. 最近用godaddy的空间,由于系统里面的表多,一个个的删除很麻烦,就网上搜集了一下解决方法. 给大家分享一下: 1.批量删除存储过程 declare @procNa ...

  9. SQL Server 系统视图

    SQL Server系统视图非常的多,因此不可能一个一个地写,我最近一直在想,对于数据库的系统视图应该如何学,但是看了一下目录之后,我呆了,我觉得每个写一次,可能都要花费1个星期的时间,如果对每一个返 ...

  10. IOS如何刷新视图上的显示内容

    大家都知道,UItableView 有个 reloadData的方法,可以tableview刷新视图.而普通的View上面.我们如何刷新视图的呢? 下图是我做的一个用户登录之后显示用户昵称和个性签名还 ...

随机推荐

  1. 说一下在写Android APP时遇到的具体问题

    问题一:总是显示出no such table错误 不要担心这个问题(该担心还是得担心一下的哈),以我出错多次的经验来看,只需要在运行APP之后,回到虚拟机的主界面,然后找到相应的APP虚拟软件,将他删 ...

  2. VsCode新建Java、SpringBoot、Python、JavaWeb项目的基本步骤

    新建Java项目 选中正上方的搜索框,按下F1快捷键,输入create Java,即可出现这样的一个命令: 选中这个: 然后为新创建的项目选择一个合适的位置就好啦! 新建SpringBoot项目 选中 ...

  3. P8112 符文破译

    题目描述 将字符串 \(T\) 拆成若干个子串,使这些子串为字符串 \(S\) 的前缀,要求拆分形成的子串数最小. 思路整理 实际上并不需要倒着枚举,也不需要线段树,更不需要 Z 函数. 如果你做过 ...

  4. vue 和 react 的区别有哪些

    vue 和 react 有什么区别呢?下面从这 4 个角度来说一说! (1)从编程范式的角度讲 在 vue-loader.vue-template-compiler 的支持下,vue 可以采用 SFC ...

  5. UI/UE设计学习路线图(超详细)

    很多小伙伴认为ui设计很简单,就是用相关的软件设计制作图片.界面等.其实不然,UI设计融合了很多学科内容.要从一个完全没有基础的人成长为一个ui设计者,该如何学习呢?主要分为基础阶段和专业课程阶段,其 ...

  6. JVM 频繁 FULL GC 快速排查整理

    在分享此案例前,先聊聊哪些场景会导致频繁Full GC: 内存泄漏(代码有问题,对象引用没及时释放,导致对象不能及时回收)死循环大对象程序执行了System.gc() 尤其是大对象,80%以上的情况就 ...

  7. 宝塔上部署FastAPI的步骤和一些注意点

    为了运维方便,选择直接用宝塔来管理python fastapi的项目,虽然直接部署可能性能更好更灵活,但是我选择了低层本,每个人的选择可能是不一样的,各有 考虑吧. 本文的大逻辑是先写一个hellow ...

  8. Wondershare Recovery - 万兴数据恢复专家,恢复你 Mac 上的重要文件

    Wondershare Recoverit 是恢复被删除文件最有效的软件之一.计算机用户面临的一个主要问题是失去机密信息.我们可能是误删除了数据和文件,或者可能是由于病毒袭击.操作系统故障或硬盘故障而 ...

  9. SQL Server底层架构技术对比

    背景 数据库是信息化的基石,支撑着整个业务系统,发挥着非常重要的作用,被喻为"IT的心脏".因此,让数据库安全.稳定.高效地运行已经成为IT管理者必须要面对的问题.数据库在底层架构 ...

  10. 在k8s(kubernetes)上安装 ingress V1.1.3

    介绍 Ingress 公开了从集群外部到集群内服务的 HTTP 和 HTTPS 路由.流量路由由 Ingress 资源上定义的规则控制. 下面是一个将所有流量都发送到同一 Service 的简单 In ...