`

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

 
阅读更多

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

——通过知识共享树立个人品牌。

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

--Removealldatafromadatabase

SETNOCOUNTON
--Tablestoignore
DECLARE@IgnoreTables
TABLE(TableNamevarchar(512))
INSERTINTO@IgnoreTables(TableName)VALUES('sysdiagrams')
DECLARE@AllRelationships
TABLE(ForeignKeyvarchar(512)
,TableNamevarchar(512)
,ColumnNamevarchar(512)
,ReferenceTableNamevarchar(512)
,ReferenceColumnNamevarchar(512)
,DeleteRulevarchar(512))
INSERTINTO@AllRelationships
SELECTf.nameASForeignKey,
OBJECT_NAME(f.parent_object_id)ASTableName,
COL_NAME(fc.parent_object_id,
fc.parent_column_id)ASColumnName,
OBJECT_NAME(f.referenced_object_id)ASReferenceTableName,
COL_NAME(fc.referenced_object_id,
fc.referenced_column_id)ASReferenceColumnName,
delete_referential_action_descasDeleteRule
FROMsys.foreign_keysASf
INNERJOINsys.foreign_key_columnsASfc
ONf.OBJECT_ID=fc.constraint_object_id


DECLARE@TableOwnervarchar(512)
DECLARE@TableNamevarchar(512)
DECLARE@ForeignKeyvarchar(512)
DECLARE@ColumnNamevarchar(512)
DECLARE@ReferenceTableNamevarchar(512)
DECLARE@ReferenceColumnNamevarchar(512)
DECLARE@DeleteRulevarchar(512)


PRINT('LoopthroughalltablesandswitchallconstraintstohaveadeleteruleofCASCADE')
DECLAREDataBaseTables0
CURSORFOR
SELECTSCHEMA_NAME(t.schema_id)ASschema_name,t.nameAStable_name
FROMsys.tablesASt;

OPENDataBaseTables0;

FETCHNEXTFROMDataBaseTables0
INTO@TableOwner,@TableName;

WHILE@@FETCH_STATUS=0
BEGIN
IF(NOTEXISTS(SELECTTOP11FROM@IgnoreTablesWHERETableName=@TableName))
BEGIN
PRINT'['+@TableOwner+'].['+@TableName+']';

DECLAREDataBaseTableRelationshipsCURSORFOR
SELECTForeignKey,ColumnName,ReferenceTableName,ReferenceColumnName
FROM@AllRelationships
WHERETableName=@TableName

OPENDataBaseTableRelationships;
FETCHNEXTFROMDataBaseTableRelationshipsINTO@ForeignKey,@ColumnName,@ReferenceTableName,@ReferenceColumnName;

IF@@FETCH_STATUS<>0
PRINT'=====>NoRelationships';

WHILE@@FETCH_STATUS=0
BEGIN
PRINT'=====>switchingdeleteruleon'+@ForeignKey+'toCASCADE';
BEGINTRANSACTION
BEGINTRY
EXEC('

ALTERTABLE[
'+@TableOwner+'].['+@TableName+']
DROPCONSTRAINT
'+@ForeignKey+';

ALTERTABLE[
'+@TableOwner+'].['+@TableName+']ADDCONSTRAINT
'+@ForeignKey+'FOREIGNKEY
(
'+@ColumnName+'
)REFERENCES
'+@ReferenceTableName+'
(
'+@ReferenceColumnName+'
)ONDELETECASCADE;
');
COMMITTRANSACTION
ENDTRY
BEGINCATCH
PRINT'=====>can''tswitch'+@ForeignKey+'toCASCADE,-'+
CAST(ERROR_NUMBER()ASVARCHAR)+'-'+ERROR_MESSAGE();
ROLLBACKTRANSACTION
ENDCATCH;

FETCHNEXTFROMDataBaseTableRelationshipsINTO@ForeignKey,@ColumnName,@ReferenceTableName,@ReferenceColumnName;
END;

CLOSEDataBaseTableRelationships;
DEALLOCATEDataBaseTableRelationships;

END
PRINT'';
PRINT'';

FETCHNEXTFROMDataBaseTables0
INTO@TableOwner,@TableName;
END
CLOSEDataBaseTables0;
DEALLOCATEDataBaseTables0;

PRINT('LoopthougheachtableandDELETEAlldatafromthetable')

DECLAREDataBaseTables1CURSORFOR
SELECTSCHEMA_NAME(t.schema_id)ASschema_name,t.nameAStable_name
FROMsys.tablesASt;

OPENDataBaseTables1;

FETCHNEXTFROMDataBaseTables1
INTO@TableOwner,@TableName;

WHILE@@FETCH_STATUS=0
BEGIN
IF(NOTEXISTS(SELECTTOP11FROM@IgnoreTablesWHERETableName=@TableName))
BEGIN
PRINT'['+@TableOwner+'].['+@TableName+']';
PRINT'=====>deletingdatafrom['+@TableOwner+'].['+@TableName+']';
BEGINTRY
EXEC('
DELETEFROM[
'+@TableOwner+'].['+@TableName+']
DBCCCHECKIDENT([
'+@TableName+'],RESEED,0)
');
ENDTRY
BEGINCATCH
PRINT'=====>can''tFROM['+@TableOwner+'].['+@TableName+'],-'+
CAST(ERROR_NUMBER()ASVARCHAR)+'-'+ERROR_MESSAGE();
ENDCATCH;
END

PRINT'';
PRINT'';

FETCHNEXTFROMDataBaseTables1
INTO@TableOwner,@TableName;
END
CLOSEDataBaseTables1;
DEALLOCATEDataBaseTables1;

PRINT('Loopthroughalltablesandswitchallconstraintstohaveadeleteruletheyhadatthebegginingofthetask')

DECLAREDataBaseTables2CURSORFOR
SELECTSCHEMA_NAME(t.schema_id)ASschema_name,t.nameAStable_name
FROMsys.tablesASt;
OPENDataBaseTables2;

FETCHNEXTFROMDataBaseTables2
INTO@TableOwner,@TableName;

WHILE@@FETCH_STATUS=0
BEGIN

IF(NOTEXISTS(SELECTTOP11FROM@IgnoreTablesWHERETableName=@TableName))
BEGIN
PRINT'['+@TableOwner+'].['+@TableName+']';

DECLAREDataBaseTableRelationshipsCURSORFOR
SELECTForeignKey,ColumnName,ReferenceTableName,ReferenceColumnName,DeleteRule
FROM@AllRelationships
WHERETableName=@TableName

OPENDataBaseTableRelationships;
FETCHNEXTFROMDataBaseTableRelationshipsINTO@ForeignKey,@ColumnName,@ReferenceTableName,@ReferenceColumnName,@DeleteRule;

IF@@FETCH_STATUS<>0
PRINT'=====>NoRelationships';

WHILE@@FETCH_STATUS=0
BEGIN
DECLARE@switchBackTovarchar(50)=
CASE
WHEN@DeleteRule='NO_ACTION'THEN'NOACTION'
WHEN@DeleteRule='CASCADE'THEN'CASCADE'
WHEN@DeleteRule='SET_NULL'THEN'SETNULL'
WHEN@DeleteRule='SET_DEFAULT'THEN'SETDEFAULT'
END

PRINT'=====>switchingdeleteruleon'+@ForeignKey+'to'+@switchBackTo;

BEGINTRANSACTION
BEGINTRY
EXEC('

ALTERTABLE[
'+@TableOwner+'].['+@TableName+']
DROPCONSTRAINT
'+@ForeignKey+';

ALTERTABLE[
'+@TableOwner+'].['+@TableName+']ADDCONSTRAINT
'+@ForeignKey+'FOREIGNKEY
(
'+@ColumnName+'
)REFERENCES
'+@ReferenceTableName+'
(
'+@ReferenceColumnName+'
)ONDELETE
'+@switchBackTo+'
');

COMMITTRANSACTION
ENDTRY
BEGINCATCH
PRINT'=====>can''tchange'+@ForeignKey+'backto'+@switchBackTo+',-'+
CAST(ERROR_NUMBER()ASVARCHAR)+'-'+ERROR_MESSAGE();
ROLLBACKTRANSACTION
ENDCATCH;

FETCHNEXTFROMDataBaseTableRelationships
INTO@ForeignKey,@ColumnName,@ReferenceTableName,@ReferenceColumnName,@DeleteRule;
END;

CLOSEDataBaseTableRelationships;
DEALLOCATEDataBaseTableRelationships;

END
PRINT'';
PRINT'';

FETCHNEXTFROMDataBaseTables2
INTO@TableOwner,@TableName;
END
CLOSEDataBaseTables2;

DEALLOCATEDataBaseTables2;

© 2011EricHu

原创作品,转贴请注明作者和出处,留此信息。

------------------------------------------------

cnBlobs:http://www.cnblogs.com/huyong/
CSDNhttp://blog.csdn.net/chinahuyong

作者:EricHuDBC\SB\SWebServiceWCFPM等)
出处:http://www.cnblogs.com/huyong/

Q Q80368704 E-Mail: 80368704@qq.com
本博文欢迎大家浏览和转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,在『参考』的文章中,我会表明参考的文章来源,尊重他人版权。若您发现我侵犯了您的版权,请及时与我联系。
更多文章请看[置顶]索引贴——(不断更新中)

分享到:
评论

相关推荐

    SQL_Server_2008维护计划实现数据库定时自动备份

    - **SQL Server Agent**:这是SQL Server的一个关键组件,用于执行自动化任务,如备份、性能监控和数据清理等。通过SQL Server Agent,用户可以创建作业,这些作业包含一系列步骤,可在特定的时间或事件触发下执行。...

    快速清除SQLServer日志的两种方法

    快速清除SQLServer日志的两...快速清除SQLServer日志的两种方法可以有效地清除日志文件,避免日志文件满而造成SQL数据库无法写入文件的情况。但是,需要注意第一种方法的风险性和数据库属性的设置,以免造成数据损失。

    SQL_Server_2008删除或压缩数据库日志的方法.doc

    标题与描述均指向了一个具体的技术问题的解决方法——在SQL Server 2008中如何删除或压缩数据库日志。这一需求通常出现在日志文件占用过多磁盘空间,或者备份过程耗时过长,影响正常业务操作的情况下。下面将详细...

    sqlserver2008数据库实例练习

    在SQL Server 2008数据库实例练习中,你可以深入理解和掌握关系型数据库的基本操作,包括查询、更新、插入和删除等核心功能。这个练习基于一个学生成绩管理系统的实例,这将帮助你将理论知识与实际应用相结合,提升...

    SQL Server数据库技术期末大作业 代码与数据库

    - `Insert_data.sql` 和 `Insert_all.sql`:这些文件很可能包含了用于向数据库中插入数据的SQL语句。可能是创建数据表并填充初始数据的过程,或者是在特定条件下批量插入数据的示例。 3. **查询语句**: - `...

    批量附加SQL数据库

    标题中的“批量附加SQL数据库”指的是利用特定的工具或脚本一次性将多个SQL Server数据库文件(MDF和NDF)附加到SQL Server实例上,而不是逐一进行。 描述中提到的“数据库质疑”可能是指数据库出现故障、损坏或者...

    百万级数据在Excel和Sql数据库之间相互导入、导出

    1. **Excel数据连接**:利用Excel的“获取和转换”或旧版的“数据导入”功能,可以直接连接到SQL Server数据库,实时查看和编辑数据。这种方法适合小批量的数据交互,但不适合百万级数据的频繁导入导出。 2. **SQL ...

    SqlServer2005日志清理方法

    SqlServer 2005日志清理是数据库管理中不可或缺的一部分,因为日志文件的不断增长可能会占用大量磁盘空间,影响系统性能。以下是一些有效的日志清理方法: 1. **简单恢复模式**:默认情况下,Sqlserver 数据库运行...

    SQL Server 2008 面向数据库管理员的安全性概述白皮书

    《SQL Server 2008 面向数据库管理员的安全性概述》白皮书是针对SQL Server 2008数据库管理系统中安全性的详细指南,旨在帮助数据库管理员(DBA)理解和实施有效的安全策略,以保护数据资产免受未经授权的访问、修改...

    SQLServer用t-sql命令批量删除数据库中指定表(游标循环删除)

    在SQL Server中,批量删除数据库中的指定表是一个常见的任务,特别是在数据清理或系统重构时。T-SQL(Transact-SQL)是SQL Server所使用的扩展SQL语法,它提供了丰富的功能来处理这类操作。本篇文章将深入讲解如何...

    在VB中批量附加SQL Server数据库.rar_VB 数据库_VB批量_packvyh_vb sql

    在VB(Visual Basic)编程环境中,与SQL Server数据库进行交互是一项常见的任务,特别是在需要处理大量数据或执行批量操作时。本资源"在VB中批量附加SQL Server数据库.rar"提供了使用VB连接并操作SQL Server数据库的...

    SQL日志清理源码 用于SQL数据库的日志清理

    - **交易日志(Transaction Log)**:在SQL Server中,交易日志记录所有对数据库的更改操作,确保数据一致性并支持回滚和快照隔离级别。 - **审计日志(Audit Log)**:记录用户活动和安全事件,用于合规性和安全...

    SQLServer数据库日志太大收缩操作指南

    本文档提供了一种详细的SQLServer数据库日志太大时的收缩操作指南,旨在帮助管理员有效地管理和减小日志文件的大小。 ### 1. 数据库日志文件过大原因 数据库日志文件过大通常是因为以下原因: 1. **事务回滚**:...

    SQL Server 2005/2008日志清理工具 自带.NET 4.0

    列出指定SQL Server 服务器上数据库列表,选择要处理的数个数据库,执行批量日志清理与数据库压缩

    清除sqlserver无效的视图及存储过程

    这些对象可能由于代码改动、表结构调整或者不再被引用而变得无用,但它们依然存在于数据库中,占用资源并可能导致错误或混淆。本话题将深入探讨如何有效地清理这些无效的视图和存储过程,确保数据库的整洁与高效运行...

    读取Excel数据导入SQL Server数据库中(asp.net)代码实例

    在ASP.NET开发中,有时我们需要将Excel数据批量导入到SQL Server数据库中,这在数据分析、报表生成或系统迁移等场景中非常常见。本教程将详细解释如何实现这一功能,主要涉及的技术点包括: 1. **读取Excel数据**:...

    从sql数据库中导出图片

    `bcp`是SQL Server提供的一个用于批量复制数据的工具,这里通过`bcp`将图片数据从数据库中导出到指定路径下的文件中。 3. **动态SQL构建**:根据输入参数动态构建SQL查询语句,然后使用`sp_executesql`执行这些SQL...

    Sybase数据转成SqlServer数据库的步骤.pdf

    转换 Sybase 数据至 Sql Server 数据库的过程涉及到一系列的步骤,主要目的是将 Sybase 数据库中的数据安全有效地迁移到 Sql Server 环境中。以下是一个详细的转换流程: 1. **前期准备**: - **恢复数据库**:...

    SqlServer批量备份多个数据库且删除3天前的备份

    在SQL Server中,批量备份多个数据库以及定期删除旧的备份是一项重要的系统维护任务,这有助于保护数据并优化存储空间。以下是对标题和描述中涉及的知识点的详细解释: 1. **批量备份数据库**: 在SQL Server中,...

    sqlserver 卸载专用

    1. **SQL Server Management Studio (SSMS)**:使用SSMS,你可以直接打开Excel文件并将其作为数据源导入到SQL Server数据库中。在“导入和导出数据”向导中,选择Excel作为源,然后指定目标数据库和表。 2. **...

Global site tag (gtag.js) - Google Analytics