[推荐] (SqlServer)批量清理指定数据库中所有数据

2023-10-27

在实际应用中,当我们准备把一个项目移交至客户手中使用时,我们需要把库中所有表先前的测试数据清空,以给客户一个干净的数据库,如果涉及的表很多,要一一的清空,不仅花费时间,还容易出错以及漏删,在这儿我提供了一个方法,可快捷有效的清空指定数据库所有表的数据。仅供参考,欢迎交流不同意见。

 

--Remove all data from a database

SET NOCOUNT ON
--Tables to ignore
DECLARE @IgnoreTables 
        TABLE (TableName varchar(512))
INSERT INTO @IgnoreTables (TableName) VALUES ('sysdiagrams')
DECLARE @AllRelationships 
        TABLE (ForeignKey varchar(512)
              ,TableName varchar(512)
              ,ColumnName varchar(512)
              ,ReferenceTableName varchar(512)
              ,ReferenceColumnName varchar(512)
              ,DeleteRule varchar(512))
INSERT INTO @AllRelationships
SELECT f.name AS ForeignKey,
OBJECT_NAME(f.parent_object_id) AS TableName,
COL_NAME(fc.parent_object_id,
fc.parent_column_id) AS ColumnName,
OBJECT_NAME (f.referenced_object_id) AS ReferenceTableName,
COL_NAME(fc.referenced_object_id,
fc.referenced_column_id) AS ReferenceColumnName,
delete_referential_action_desc as DeleteRule
FROM sys.foreign_keys AS f
INNER JOIN sys.foreign_key_columns AS fc
ON f.OBJECT_ID = fc.constraint_object_id
 

DECLARE @TableOwner varchar(512)
DECLARE @TableName varchar(512)
DECLARE @ForeignKey varchar(512)
DECLARE @ColumnName varchar(512)
DECLARE @ReferenceTableName varchar(512)
DECLARE @ReferenceColumnName varchar(512)
DECLARE @DeleteRule varchar(512)
 
 
PRINT('Loop through all tables and switch all constraints to have a delete rule of CASCADE')
DECLARE DataBaseTables0 
CURSOR FOR 
SELECT SCHEMA_NAME(t.schema_id) AS schema_name, t.name AS table_name
FROM sys.tables AS t;

OPEN DataBaseTables0; 

FETCH NEXT FROM DataBaseTables0 
INTO @TableOwner,@TableName;

WHILE @@FETCH_STATUS = 0
BEGIN 
    IF (NOT EXISTS(SELECT TOP 1 1 FROM @IgnoreTables WHERE TableName = @TableName))
    BEGIN
        PRINT '['+@TableOwner+'].[' + @TableName + ']';

        DECLARE DataBaseTableRelationships CURSOR FOR 
        SELECT ForeignKey, ColumnName, ReferenceTableName, ReferenceColumnName
        FROM @AllRelationships 
        WHERE TableName = @TableName

        OPEN DataBaseTableRelationships;
        FETCH NEXT FROM DataBaseTableRelationships INTO @ForeignKey, @ColumnName, @ReferenceTableName, @ReferenceColumnName;

        IF @@FETCH_STATUS <> 0 
            PRINT '=====> No Relationships' ; 

        WHILE @@FETCH_STATUS = 0
        BEGIN
            PRINT '=====> switching delete rule on ' + @ForeignKey + ' to CASCADE';
            BEGIN TRANSACTION
            BEGIN TRY
                EXEC('

                ALTER TABLE ['+@TableOwner+'].[' + @TableName + ']
                 DROP CONSTRAINT '+@ForeignKey+';

                ALTER TABLE ['+@TableOwner+'].[' + @TableName + '] ADD CONSTRAINT
                '+@ForeignKey+' FOREIGN KEY
                (
                '+@ColumnName+'
                ) REFERENCES '+@ReferenceTableName+'
                (
                '+@ReferenceColumnName+'
                ) ON DELETE CASCADE;
                ');
                COMMIT TRANSACTION
            END TRY
            BEGIN CATCH
                PRINT '=====> can''t switch ' + @ForeignKey + ' to CASCADE, - ' +
                CAST(ERROR_NUMBER() AS VARCHAR) + ' - ' + ERROR_MESSAGE();
                ROLLBACK TRANSACTION
            END CATCH;
            
            FETCH NEXT FROM DataBaseTableRelationships INTO @ForeignKey, @ColumnName, @ReferenceTableName, @ReferenceColumnName;
        END;

        CLOSE DataBaseTableRelationships;
        DEALLOCATE DataBaseTableRelationships;

        END
        PRINT '';
        PRINT '';

        FETCH NEXT FROM DataBaseTables0 
        INTO @TableOwner,@TableName;
    END
CLOSE DataBaseTables0;
DEALLOCATE DataBaseTables0;

PRINT('Loop though each table and DELETE All data from the table')

DECLARE DataBaseTables1 CURSOR FOR 
SELECT SCHEMA_NAME(t.schema_id) AS schema_name, t.name AS table_name
FROM sys.tables AS t;

OPEN DataBaseTables1; 

FETCH NEXT FROM DataBaseTables1 
INTO @TableOwner,@TableName;

WHILE @@FETCH_STATUS = 0
BEGIN 
    IF (NOT EXISTS(SELECT TOP 1 1 FROM @IgnoreTables WHERE TableName = @TableName))
    BEGIN
        PRINT '['+@TableOwner+'].[' + @TableName + ']';
        PRINT '=====> deleting data from ['+@TableOwner+'].[' + @TableName + ']';
        BEGIN TRY
            EXEC('
                 DELETE FROM ['+@TableOwner+'].[' + @TableName + ']
                 DBCC CHECKIDENT ([' + @TableName + '], RESEED, 0)
                 ');
        END TRY
        BEGIN CATCH
            PRINT '=====> can''t FROM ['+@TableOwner+'].[' + @TableName + '], - ' +
                  CAST(ERROR_NUMBER() AS VARCHAR) + ' - ' + ERROR_MESSAGE();
        END CATCH;
    END
     
    PRINT '';
    PRINT '';
     
    FETCH NEXT FROM DataBaseTables1 
    INTO @TableOwner,@TableName;
END
CLOSE DataBaseTables1;
DEALLOCATE DataBaseTables1; 
 
PRINT('Loop through all tables and switch all constraints to have a delete rule they had at the beggining of the task')

DECLARE DataBaseTables2 CURSOR FOR 
SELECT SCHEMA_NAME(t.schema_id) AS schema_name, t.name AS table_name
FROM sys.tables AS t;
OPEN DataBaseTables2; 

FETCH NEXT FROM DataBaseTables2 
INTO @TableOwner,@TableName;

WHILE @@FETCH_STATUS = 0
BEGIN
 
    IF (NOT EXISTS(SELECT TOP 1 1 FROM @IgnoreTables WHERE TableName = @TableName))
    BEGIN
    PRINT '['+@TableOwner+'].[' + @TableName + ']';

    DECLARE DataBaseTableRelationships CURSOR FOR 
    SELECT ForeignKey, ColumnName, ReferenceTableName, ReferenceColumnName, DeleteRule
    FROM @AllRelationships 
    WHERE TableName = @TableName

    OPEN DataBaseTableRelationships;
    FETCH NEXT FROM DataBaseTableRelationships INTO @ForeignKey, @ColumnName, @ReferenceTableName, @ReferenceColumnName, @DeleteRule;

    IF @@FETCH_STATUS <> 0 
    PRINT '=====> No Relationships' ; 

    WHILE @@FETCH_STATUS = 0
    BEGIN
        DECLARE @switchBackTo varchar(50) =
        CASE 
            WHEN @DeleteRule = 'NO_ACTION' THEN 'NO ACTION'
            WHEN @DeleteRule = 'CASCADE' THEN 'CASCADE'
            WHEN @DeleteRule = 'SET_NULL' THEN 'SET NULL'
            WHEN @DeleteRule = 'SET_DEFAULT' THEN 'SET DEFAULT'
        END 

        PRINT '=====> switching delete rule on ' + @ForeignKey + ' to ' + @switchBackTo;

        BEGIN TRANSACTION
        BEGIN TRY
            EXEC('

            ALTER TABLE ['+@TableOwner+'].[' + @TableName + ']
            DROP CONSTRAINT '+@ForeignKey+';

            ALTER TABLE ['+@TableOwner+'].[' + @TableName + '] ADD CONSTRAINT
            '+@ForeignKey+' FOREIGN KEY
            (
            '+@ColumnName+'
            ) REFERENCES '+@ReferenceTableName+'
            (
            '+@ReferenceColumnName+'
            ) ON DELETE '+@switchBackTo+'
            ');
            
            COMMIT TRANSACTION
        END TRY
        BEGIN CATCH
            PRINT '=====> can''t change '+@ForeignKey + ' back to '+ @switchBackTo +', - ' +
            CAST(ERROR_NUMBER() AS VARCHAR) + ' - ' + ERROR_MESSAGE();
            ROLLBACK TRANSACTION
        END CATCH;

        FETCH NEXT FROM DataBaseTableRelationships 
        INTO @ForeignKey, @ColumnName, @ReferenceTableName, @ReferenceColumnName, @DeleteRule;
    END;

    CLOSE DataBaseTableRelationships;
    DEALLOCATE DataBaseTableRelationships;

    END
    PRINT '';
    PRINT '';

    FETCH NEXT FROM DataBaseTables2 
    INTO @TableOwner,@TableName;
END
CLOSE DataBaseTables2;
DEALLOCATE DataBaseTables2;


原文地址:http://www.cnblogs.com/huyong/archive/2012/01/17/2323663.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[推荐] (SqlServer)批量清理指定数据库中所有数据 的相关文章

  • SQL Server 将 varbinary 转换为字符串

    我想在 T SQL 中进行转换varbinary类型转字符串类型 这是一个例子 首先我得到了这个varbinary 0x21232F297A57A5A743894A0E4A801FC3 然后我想将其转换为 21232f297a57a5a74
  • Android 内容提供商更新某些列

    我正在尝试制作一个 Android 应用程序来确定完成任务还剩多少时间 我遵循了Vogella的教程 特别是这一部分http www vogella com articles AndroidSQLite article html todo
  • SQL Server 的 printf

    Sql Server中有类似printf的函数吗 我想要与 RAISERROR 函数相同的功能 但我不想抛出错误或打印消息 而是想将其写在 varchar 中 因为我的 ERP 不允许我处理错误消息 这是 SQL Server 2000 R
  • 在存储过程中使用动态sql中的临时表

    我正在 SQL Server 2012 中编写存储过程 我有一个像这样定义的临时表 DECLARE CURRENT RET WEEK PTIMEIDS TABLE PTIMEID INT 我也在使用EXECUTE编写动态 SQL 查询 有什
  • 逗号分隔列表作为单个字符串,T-SQL [重复]

    这个问题在这里已经有答案了 我的 T SQL 查询生成以下结果集 ID Date 756 2011 08 29 756 2011 08 31 756 2011 09 01 756 2011 09 02 我怎样才能像这样转换 ID Date
  • “等待操作超时”...但仅来自 .NET 客户端?

    我有一个查询 当从我的应用程序执行时会抛出 SqlException 0x80131904 超时已过期 操作完成之前超时时间已过 或者服务器没有响应 在 Visual Studio 中单步执行代码时 我遇到了同样的错误 但是 当使用相同的凭
  • 获取 TransactSql 批处理中的语句数计数

    对于不使用 Delphi 的读者 虽然以下内容是根据 Delphi 编码来表达的 但我的实际技术问题不是特定于 Delphi 的 而是关于如何找出 Sql Server 如何 理解 TransactSql 批处理提交给它 TAdoQuery
  • 使用signalR将聊天对话存储在sql数据库中

    我正在开发一个类库 其中包含适用于这些场景的通用方法 实时支持聊天 一对一私人文本聊天 与许多管理员和访客 拥有许多用户的房间 您可以在其中发送广播和私人消息 上面这两个功能已经实现 现在我的应用程序需要保存消息 我的问题是 在 SQL 数
  • Access 2007 数据库和应用程序的版本控制

    我需要对 Microsoft Access 2007 数据库和应用程序进行版本控制 目前 所有内容都包含在单个 mdb 文件中 该应用程序包括 Forms VBA code 实际数据库 我假设我需要将数据库与表单 代码分开 我希望能够将表单
  • 关闭数据集插入的 IDENTITY_INSERT

    我正在使用数据集插入从旧数据库转换而来的数据 要求是维护当前的 Order ID 编号 我尝试过使用 SET IDENTITY INSERT orders ON 当我在 Sql Server Management Studio 中时 这有效
  • 在 SQL Server 中将行转换为 XML 格式

    我有如下要求 上图的 ddl 和 dml 脚本是 CREATE TABLE example CCP DETAILS SID int ACCOUNT GROWTH int PRODUCT GROWTH int PROJECTION SALES
  • SSIS Excel 导入强制错误的列类型

    我正在尝试使用 SSIS 将电子表格导入到我们的数据库中 由于某种原因 当其中两列包含字符数据时 SSIS 希望相信它们的类型为 Double 我尝试将列重新映射为 nvarchar 255 但它仍然不想选择它认为是双精度的数据 因为其中有
  • SQL Server 条件流

    如果我写两个SELECT中的语句IF EXISTS条件与AND这些选择查询之间的子句 即使第一个查询是否都会执行两个查询SELECT返回假 IF EXISTS SELECT AND EXISTS SELECT BEGIN END 在这种情况
  • TSQL - 如何在 BEGIN .. END 块内使用 GO?

    我正在生成一个脚本 用于自动将更改从多个开发数据库迁移到登台 生产 基本上 它需要一堆更改脚本 并将它们合并成一个脚本 将每个脚本包装在一个IF whatever BEGIN END陈述 然而 有些脚本需要GO语句 以便 SQL 解析器在创
  • 如何中止触发器中的多行插入

    使用 SQL Server 2005 我已经声明了一个触发 AFTER INSERT UPDATE 的触发器 在这个触发器中 我使用 WHILE 和 CURSOR 在 INSERTED 表的行上循环 当我发现一行不满足特定条件时 我希望触发
  • 清理 couchdb 并重新启动

    清理命令是什么CouchDB请 如果我想disable and re start我的CouchDB命令是什么 Thanks CouchDB 可以从以下位置启动 停止 重新启动 etc init d couchdb or etc rc d c
  • PHP - 解析具有固定列宽的文本文件

    我是 PHP 和 Laravel 的新手 我需要打开文件并解析内容以将它们传递到数据库 文本文件具有固定的列宽 它没有分隔符或标题 我认为使用子字符串并将每个子字符串分配给变量将是正确的方法 但我仍在学习该语言的过程中 我不知道如何实现这一
  • SQLite 性能基准 - 为什么 :memory: 这么慢...只有磁盘速度的 1.5 倍?

    为什么 sqlite 中的 memory 这么慢 我一直在尝试查看使用内存中的 sqlite 与基于磁盘的 sqlite 是否可以获得任何性能改进 基本上我想用启动时间和内存来换取非常快速的查询not在应用程序过程中击中磁盘 然而 以下基准
  • CLR 程序集不会在 64 位 SQL Server 2005 中加载

    我们在安装 SQL Server 2005 32 位 时使用带有一些用户定义函数的程序集 我们使用如下脚本将其部署到生产环境 CREATE ASSEMBLY Ourfunctions AUTHORIZATION dbo FROM 0x4D5
  • CROSS APPLY WHERE 子句在交叉应用之前或结果之后起作用吗

    我正在做一种我们在一个内部应用程序中需要的自定义模糊匹配算法 我正在努力加快速度 当我对模糊函数进行交叉应用以查找建议的匹配项时 我不想搜索不必要的数据 这是函数 select top 5 Manufacturer Manufacturer

随机推荐

  • 4个数据整理Excel小技巧,省下你80%的工作时间

    各位小伙伴 不知道你觉得工作中哪项任务是最烦的呢 那么今天 将几个特别实用的整理报表数据Excel小技巧带给大家 让我们把复杂的问题简单化 来吧 好好学习 天天向上 更加进步吧 1 输入证件号码 在录入个人身份信息的时候 身份证号有时候是经
  • 又一款 AI 应用开源了,让你的绘画作品动起来!

    这是 进击的Coder 的第 824 篇技术分享 作者 小 G 来源 GitHubDaily 阅读本文大概需要 4 分钟 2021 年的时候 Meta 前身是 Facebook 团队发布了一款非常有趣的 AI 工具 叫 Animated D
  • Excel根据出生日期判断生肖,Leo老师来教你!

    在工作学习中 我们经常会遇到Excel根据出生日期判断生肖这样的问题 列夫托尔斯泰说过 人生不是一种享乐 而是一桩十分沉重的工作 因此 面对Excel根据出生日期判断生肖我们应该有努力探索的精神 成功的人千方百计 失败的人千难万险 对于这个
  • python虚拟环境安装使用

    conda下操作 1 查看已经安装的虚拟环境 conda env list 2 创建 conda create n your env name 3 进入虚拟环境 conda activate your env name 4 退出虚拟环境 c
  • 09.二叉树

    09 二叉树 1 树型结构 1 1概念 树是一种非线性的数据结构 它是由n n gt 0 个有限结点组成一个具有层次关系的集合 把它叫做树是因为它看起来像一棵倒挂的树 也就是说它是根朝上 而叶朝下的 它具有以下的特点 有一个特殊的结点 称为
  • 最小二乘法与伪逆矩阵

    一 简介 最小二乘法是一种数学优化技术 通过最小化误差的平方和寻找数据的最佳函数匹配 利用最小二乘法可以简便地求得未知的数据 并是得这些求得的数据与实际数据之间误差的平方和最小 二 最小二乘法拟合直线的原理 1 假设存在n个坐标点 他们的坐
  • C语言的四种程序结构

    1 顺序结构 顺序结构的程序设计是最简单的 只要按照解决问题的顺序写出相应的语句就行 它的执行顺序是自上而下 依次执行 例如 a 3 b 5 现交换a b的值 这个问题就好像交换两个杯子水 这当然要用到第三个杯子 假如第三个杯子是c 那么正
  • anaconda python未激活_anaconda无法激活新建环境,提示没有那个文件或目录

    遇到的问题 最新在部署tensorflow 但是由于cpu型号比较老的原因 所以直接pip安装tensorflow会提示core dump 吐核 所以需要使用conda来建立一个新的环境 然后使用conda来安装tf即可解决吐核问题 但是有
  • 高效实现延迟消息功能

    高效实现延迟消息功能 高效延时消息 包含两个重要的数据结构 1 环形队列 例如可以创建一个包含3600个slot的环形队列 本质是个数组 2 任务集合 环上每一个slot是一个Set 同时 启动一个timer 这个timer每隔1s 在上述
  • Unity2D入门(七):物理材质、跳跃、基础UI

    一 物理材质 游戏角色在跳跃过程中如果正面碰撞到地形就会卡在上面 所以需要为其添加一种材质 在Assets窗口中 右键 gt 新建一个物理材质 不用做其他的调整 将其拖拽到Player Inspector窗口中的BoxCollider组件的
  • Python测试框架pytest(17)参数化parametrize

    目录 1 参数 2 装饰测试类 3 多个参数化装饰器 4 参数化 传入字典数据 5 标记参数化 6 解决unicode编码问题 pytest mark parametrize 允许在测试函数或类中定义多组参数和 fixtures 参数化场景
  • Stream流

    Stream流的常见生成方式 Stream流中间操作之filter Stream流的常见中间操作方法 Stream流终结操作之forEach count Stream流的收集操作 Stream流的常见生成方式 Stream流的使用 生成流
  • SpringBoot错误: 找不到或无法加载主类

    1 一般出现这种情况都是配置文件application properties出现的问题 2 可以尝试 maven clean install 以及rebuild project 3 删除项目里 idea文件 重新导入至IDEA编辑器 选择M
  • vs2010中臃肿的ipch和sdf文件

    使用VS2010建立C 解决方案时 会生成SolutionName sdf和一个叫做ipch的文件夹 这两个文件再加上 pch等文件使得工程变得非常的庞大 一个简单的程序都会占用几十M的硬盘容量 可惜毕竟硬盘还没有廉价到免费的地步 那么 该
  • 绘图系统二:多图绘制系统

    文章目录 坐标轴控件 坐标系控件 绘制多组数据 源代码 本文基于 从0开始实现一个三维绘图系统 坐标轴控件 三个坐标轴xyz从外观上看其实毫无区别 这种标签和输入框的组合十分常见 为了便于调用 最好实现一个类 tkinter只要继承Fram
  • MyBatis-Plus中的逻辑删除使用

    系列文章目录 Mybatis Plus SpringBoot结合运用 心态还需努力呀的博客 CSDN博客MyBaits Plus中 TableField和 TableId用法 心态还需努力呀的博客 CSDN博客 MyBatis Plus分页
  • 如何通过C语言自动生成MAC地址

    如何通过C语言自动生成MAC地址 最近在做虚拟机项目时 需要给创建的每一个虚拟机自动生成一个MAC地址 由于MAC地址为48位 而且格式是以 隔开的 所以下面我写了一个c程序 来自动生成MAC地址 MAC c include
  • solidity实现智能合约教程(5)-NFT拍卖合约

    文章目录 1 介绍 2 主要功能 3 代码示例 4 部署测试 猛戳订阅学习专栏 solidity系列合约源码 解析 1 介绍 拍卖作为历史悠久的交易方式 具有规范化 市场化的特点 在经济活动中扮演着重要角色 以其公开 公平 公正的价格发现功
  • unity动态加载(1)Resources加载方法

    在开发过程中我们很可能需要使用到动态加载 这样一方面可以节省性能 另一方面使我们的开发过程更加便捷 我之前写过一篇游戏中音效控制器 可以很方便的播放音效 就是用Resources 传送门 大家如果有兴趣可以参考 然后这篇博客实现以下使用Re
  • [推荐] (SqlServer)批量清理指定数据库中所有数据

    在实际应用中 当我们准备把一个项目移交至客户手中使用时 我们需要把库中所有表先前的测试数据清空 以给客户一个干净的数据库 如果涉及的表很多 要一一的清空 不仅花费时间 还容易出错以及漏删 在这儿我提供了一个方法 可快捷有效的清空指定数据库所