T-SQL——批量刷新视图

这篇具有很好参考价值的文章主要介绍了T-SQL——批量刷新视图。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录
  • 0. 背景说明
  • 1. 查询出所有使用了指定表的视图并生成刷新语句
  • 2. 创建存储过程批量刷新
  • 3. 刷新全部的视图
  • 4. 参考
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. 参考

  • 13. 查看数据库对象间的依赖关系

    • 该文详细的说明的sql server中的对象的依赖关系的查询
  • SQL Server 修改表结构后批量更新所有视图

  • 表结构改动后视图问题文章来源地址https://www.toymoban.com/news/detail-452142.html

到了这里,关于T-SQL——批量刷新视图的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 浅谈SQL Server索引视图(物化视图)以及索引视图与查询重写

    目录 (一)前言 (二)正文 1. 物化视图(索引视图)与查询重写的基本概念 2. 创建测试环境 (1)建表 (2)写数据 3. 索引视图创建 (1)创建语法 (2)为索引视图创建索引  4. 查询重写 5. 为什么查询会被重写  6. 索引视图什么时候更新 7. 改变基于视图的查询 之前做

    2024年02月05日
    浏览(54)
  • SQL 日期处理和视图创建:常见数据类型、示例查询和防范 SQL 注入方法

    在数据库操作中,处理日期是一个关键的方面。确保插入的日期格式与数据库中日期列的格式匹配至关重要。以下是一些常见的SQL日期数据类型和处理方法。 DATE - 格式为YYYY-MM-DD DATETIME - 格式为YYYY-MM-DD HH:MI:SS TIMESTAMP - 格式为YYYY-MM-DD HH:MI:SS YEAR - 格式为YYYY或YY DATE - 格式为YY

    2024年02月05日
    浏览(47)
  • 解决Oracle SQL语句性能问题——SQL语句改写(视图、标量子查询及update)

    我们在前述文章中也已经提到,对于高版本的关系库,尤其是针对Oracle这样的关系库,绝大多数场景下,同一语义和结果的SQL语句的具体语法,不会成为SQL语句执行计划的影响因素,但在少数场景下,针对同一语义和结果的SQL语句的不同写法,数据库优化器最终会分别为其生

    2024年02月10日
    浏览(40)
  • SQL与T-SQL的区别

    🌟 SQL = Structured Query Language (结构化查询语言) 🌟 T-SQL = Transact-SQL = SQL 在 Microsoft SQL Server 上的增强版 ,它是用来让应用程序与 Microsoft SQL Server 沟通的主要语言。 两者 都是语言 . 那么在sql server查询分析器中的语句是sql 还是T-sql? 这个要看你输入的是什么? 因为 ⭐️ T-SQL

    2024年02月06日
    浏览(31)
  • Microsoft SQL Server 2022 新特性之 T-SQL 语言增强

    Microsoft SQL Server 2022 已经正式发布,可以下载使用。本文给大家介绍一下该版本中的部分 T-SQL 新功能。 新版本中的窗口函数支持命名窗口(WINDOW)子句,可以利用该子句定义窗口变量,然后在 OVER 子句中使用该窗口变量。 举例说明(示例脚本): 示例使用 WINDOW 子句定义了

    2024年02月04日
    浏览(36)
  • 数据库--T-SQL创建数据库表

    T-SQL创建数据库表要求如下: 1.给出一个名为xxgl的数据库,并将其附加到当前实例中。 创建一个名为xxgl的数据库,该数据库有一个数据文件和一个日志文件组成,主数据文件其逻辑名为xxgl ,物理名为xxgl.mdf,存放在e:sql文件夹下。初始大小为10MB,最大大小为30MB,自动增长

    2023年04月08日
    浏览(33)
  • 【SQL Server】数据库开发指南(三)面向数据分析的 T-SQL 编程技巧与实践

    本系列博文还在更新中,收录在专栏:#MS-SQL Server 专栏中。 本系列文章列表如下: 【SQL Server】 Linux 运维下对 SQL Server 进行安装、升级、回滚、卸载操作 【SQL Server】数据库开发指南(一)数据库设计的核心概念和基本步骤 【SQL Server】数据库开发指南(二)MSSQL数据库开发对

    2023年04月12日
    浏览(63)
  • Padding负值遮挡视图(下拉刷新头部)

    padding值 为 负值 时,表示 当前视图被遮住了一部分 。 可使用 view .set Padding(  int left , int top , int right , int bottom ) 方法进行动态设置。 下拉刷新头部的实现: (1) 获取屏幕大小。 (2) 设置 刷新头高度(定值)      设置 显示部分高度为/屏幕高度(定值)      设置 整体高度

    2024年02月06日
    浏览(35)
  • sqlserver  sql 异常<除非另外还指定了 TOP、OFFSET 或 FOR XML,否则,ORDER BY 子句在视图、内联函数、派生表、子查询和公用表表达式中无效。>

    问题:使用sql查询时报错 解决办法:在sql子查询SELECT 后加 TOP 100 PERCENT (查询出前百分比为100的数据,也就是查询出全部数据) ,如下

    2024年02月15日
    浏览(75)
  • vue2修改数组或对象,但视图不刷新

    问题:我们在vue2开发过程中会碰到数据更新,但是页面并未改变的情况,原因如下:         第一种:动态给对象新增属性或者删除属性是不会触发视图刷新的,Vue识别不到;         第二种:通过数组下标修改数组中的元素或者手动修改数组的长度,Vue识别不到;   解决

    2024年02月11日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包