`

[推荐] (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删除或压缩数据库日志的方法.doc

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

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

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

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

    sqlserver存储过程,视图多,项目不断优化升级,部分存储过程,视图已经报错,但是一直存在数据库中,用vs2013及以上打开项目,运行清理无效的视图,存储过程

    护卫神·挂马清理工具 v2.3.zip

    护卫神·挂马清理工具是针对目前网页或数据库频繁被挂马的情况,我们特别开发的一款专业批量清理网页、Access数据库、SQL Server数据库和MySQL数据库挂马代码的实用软件,绿色免费;迅速帮您从海量文件和数据中清理...

    sqlserver 批量数据替换助手V1.0版发布

    前段时间网站被挂马,数据库表中很多文本字段都被加上了一段js脚本。修复完程序漏洞之后便开始着手清理这些被注入的数据,其间参考了一些网上的方法,大都是写一个存储过程进行一个表一个表逐一清理。

    完美解决因数据库一次查询数据量过大导致的内存溢出问题

    今天小编就为大家分享一篇完美解决因数据库一次查询数据量过大导致的内存溢出问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part1

    实例244 将文本文件中数据存储到数据库中 316 4.5 文件的压缩与解压 318 实例245 PHP中压缩RAR文件 319 实例246 PHP中将上传文件转换成RAR文件 320 实例247 PHP中对RAR文件进行解压 321 实例248 PHP中压缩ZIP文件 ...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part2

    实例244 将文本文件中数据存储到数据库中 316 4.5 文件的压缩与解压 318 实例245 PHP中压缩RAR文件 319 实例246 PHP中将上传文件转换成RAR文件 320 实例247 PHP中对RAR文件进行解压 321 实例248 PHP中压缩ZIP文件 ...

    SQL2005日志收缩方法

    您可能感兴趣的文章:有用的SQL语句(删除重复记录,收缩日志)SQL语句实现SQL Server 2000及Sql Server 2005日志收缩(批量)Sqlserver 2000/2005/2008 的收缩日志方法和清理日志方法收缩数据库日志文件的方法(仅适用...

    2021数据仓库服务常见问题汇总-华为-51页.pdf

    1 通用问题 ...6.2 如何查看数据库中的所有用户和权限信息? 6.3 如何REVOKE 某用户的connect on database 权限? 7 数据库使用 7.1 GaussDB(DWS)数据库设置主键后还需要设置分布键吗? …………

    风越ASP代码生成器 2.4

    《风越ASP代码生成器 [FireAsp Creator]》是一款采用.Net FrameWork2.0框架,基于Microsoft SQL Server及Microsoft Access数据库的ASP代码生成软件,可快速建立数据信息的:添加、编辑、查看、列表、搜索页面。...

    03开源NewSql数据库TiDB-Deep Dive into TiDB

    在这一版本中,SQL 执行引擎引入新的内部数据表示方式 --- `Chunk`,一个结构中保存一批数据而不仅是一行数据,同一列的数据在内存中连续存放,使得内存使用更紧凑,这样带来了几点好处:1. 显著减小了内存消耗; 2....

    清除表和字段所有注释信息

    清空表和字段所有的注释信息,主要用于发布数据库时使用。

    风越ASP代码生成器FireAspCreatorv2.9.rar

    02、支持Microsoft SQL Server、Microsoft Access、Oracle、MySql、Excel、FoxPro、FoxBase、Text等数据库连接 03、支持从数据表、视图(Access为查询)中读取数据字段 04、支持通过数据表中的组合主键传递参数 05、...

    风越.Net代码生成器 [FireCode Creator] V1.3 精简版

    02、支持Microsoft SQL Server、Microsoft Access、Oracle、MySql、Excel、FoxPro、FoxBase、Text等数据库连接 03、支持从数据表、视图(Access为查询)中读取数据字段 04、支持通过数据表中的组合主键传递参数 05、...

    风越.net代码生成器v2.9

    02、支持Microsoft SQL Server、Microsoft Access、Oracle、MySql、Excel、FoxPro、FoxBase、Text等数据库连接 03、支持从数据表、视图(Access为查询)中读取数据字段 04、支持通过数据表中的组合主键传递参数 05、...

    风越ASP代码生成器2.8

    02、支持Microsoft SQL Server、Microsoft Access、Oracle、MySql、Excel、FoxPro、FoxBase、Text等数据库连接 03、支持从数据表、视图(Access为查询)中读取数据字段 04、支持通过数据表中的组合主键传递参数 05、...

    娱乐先锋论坛KQJBBS 5.1版

    (1)支持 Access 、MS SQL SERVER、ORACLE、MYSQL 数据库 (2)支持IE、Netscape、Opera等浏览器访问论坛 (3)支持论坛的共享数据数据在服务器缓存,极大提高web服务器的性能。 (4)支持无限级子论坛...

    娱乐先锋论坛 KQJBBS 4.7版

    论坛功能: (1)支持 Access 、MS SQL SERVER、ORACLE、MYSQL 数据库 (2)论坛的共享数据数据采用服务器缓存机制,极大的减少访问数据库的次数,从而web服务器的性能。系统速度快,占用的系统资源极少。...

Global site tag (gtag.js) - Google Analytics