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

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
简介:
-- 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;  

 


本文转自yonghu86 51CTO博客,原文链接:http://blog.51cto.com/yonghu/1321333,如需转载请自行联系原作者

相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS&nbsp;SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/sqlserver
相关文章
|
8天前
|
SQL 人工智能 算法
【SQL server】玩转SQL server数据库:第二章 关系数据库
【SQL server】玩转SQL server数据库:第二章 关系数据库
51 10
|
8天前
|
SQL 算法 数据库
【SQL server】玩转SQL server数据库:第三章 关系数据库标准语言SQL(二)数据查询
【SQL server】玩转SQL server数据库:第三章 关系数据库标准语言SQL(二)数据查询
68 6
|
2天前
|
存储 关系型数据库 MySQL
如何处理爬取到的数据,例如存储到数据库或文件中?
处理爬取的数据,可存储为txt、csv(适合表格数据)或json(适合结构化数据)文件。若需存储大量数据并执行复杂查询,可选择关系型(如MySQL)或非关系型(如MongoDB)数据库。以MySQL为例,需安装数据库和Python的pymysql库,创建数据库和表,然后编写Python代码进行数据操作。选择存储方式应考虑数据类型、数量及后续处理需求。
8 1
|
3天前
|
SQL 关系型数据库 MySQL
关系型数据库插入数据的语句
使用SQL的`INSERT INTO`语句向关系型数据库的`students`表插入数据。例如,插入一个`id`为1,`name`为&#39;张三&#39;,`age`为20的记录:`INSERT INTO students (id, name, age) VALUES (1, &#39;张三&#39;, 20)。如果`id`自增,则可简化为`INSERT INTO students (name, age) VALUES (&#39;张三&#39;, 20)`。
5 2
|
3天前
|
SQL 存储 Oracle
关系型数据库查询数据的语句
本文介绍了关系型数据库中的基本SQL查询语句,包括选择所有或特定列、带条件查询、排序、分组、过滤分组、表连接、限制记录数及子查询。SQL还支持窗口函数、存储过程等高级功能,是高效管理数据库的关键。建议深入学习SQL及相应数据库系统文档。
6 2
|
8天前
|
SQL 存储 数据挖掘
数据库数据恢复—RAID5上层Sql Server数据库数据恢复案例
服务器数据恢复环境: 一台安装windows server操作系统的服务器。一组由8块硬盘组建的RAID5,划分LUN供这台服务器使用。 在windows服务器内装有SqlServer数据库。存储空间LUN划分了两个逻辑分区。 服务器故障&初检: 由于未知原因,Sql Server数据库文件丢失,丢失数据涉及到3个库,表的数量有3000左右。数据库文件丢失原因还没有查清楚,也不能确定数据存储位置。 数据库文件丢失后服务器仍处于开机状态,所幸没有大量数据写入。 将raid5中所有磁盘编号后取出,经过硬件工程师检测,没有发现明显的硬件故障。以只读方式将所有磁盘进行扇区级的全盘镜像,镜像完成后将所
数据库数据恢复—RAID5上层Sql Server数据库数据恢复案例
|
16天前
|
SQL 数据可视化 关系型数据库
轻松入门MySQL:深入探究MySQL的ER模型,数据库设计的利器与挑战(22)
轻松入门MySQL:深入探究MySQL的ER模型,数据库设计的利器与挑战(22)
|
16天前
|
存储 关系型数据库 MySQL
轻松入门MySQL:数据库设计之范式规范,优化企业管理系统效率(21)
轻松入门MySQL:数据库设计之范式规范,优化企业管理系统效率(21)
|
16天前
|
关系型数据库 MySQL 数据库
轻松入门MySQL:精准查询,巧用WHERE与HAVING,数据库查询如虎添翼(7)
轻松入门MySQL:精准查询,巧用WHERE与HAVING,数据库查询如虎添翼(7)
|
18天前
|
存储 关系型数据库 MySQL
数据库字符编码MySQL中使用UTF-8还是UTFB4
数据库字符编码MySQL中使用UTF-8还是UTFB4
20 0