微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

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

-- Removealldatafromadatabase

SETNOCOUNT ON
Tablestoignore
DECLARE @IgnoreTables
TABLE(TableName varchar( 512))
INSERT INTO @IgnoreTables(TableName) VALUES( ' sysdiagrams ')
@AllRelationships
TABLE(ForeignKey varchar( 512)
,TableName SELECTf.name ASForeignKey,
OBJECT_NAME(f.parent_object_id) ASTableName,255);">COL_NAME(fc.parent_object_id,
fc.parent_column_id) ASColumnName,255);">OBJECT_NAME(f.referenced_object_id) ASReferenceTableName,255);">COL_NAME(fc.referenced_object_id,
fc.referenced_column_id) ASReferenceColumnName,
delete_referential_action_desc asDeleteRule
FROMsys.foreign_keys ASf
INNER JOINsys.foreign_key_columns ASfc
ONf. OBJECT_ID =fc.constraint_object_id


@TableOwner varchar( 512)
@TableName @ForeignKey @ColumnName @ReferenceTableName @ReferenceColumnName @DeleteRule varchar( 512)


PRINT( LoopthroughalltablesandswitchallconstraintstohaveadeleteruleofCASCADE DECLAREDataBaseTables0
CURSOR FOR
SELECTSCHEMA_NAME(t.schema_id) ASschema_name,t.name AStable_name
FROMsys.tables ASt;

OPENDataBaseTables0;

FETCH NEXT FROMDataBaseTables0
@TableOwner,@TableName;

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

DECLAREDataBaseTableRelationships SELECTForeignKey,ColumnName,ReferenceTableName,ReferenceColumnName
@TableName

OPENDataBaseTableRelationships;
FROMDataBaseTableRelationships @ForeignKey,0);">@ColumnName,0);">@ReferenceTableName,0);">@ReferenceColumnName;

IF @@FETCH_STATUS <> 0
=====>norelationships =====>switchingdeleteruleon @ForeignKey toCASCADE ';
BEGIN TRANSACTION
BEGINTRY
EXEC(

ALTERTABLE[
]
DROPCONSTRAINT
;

ALTERTABLE[
]ADDCONSTRAINT
FOREIGNKEY
(
@ColumnName
)REFERENCES
@ReferenceTableName
(
@ReferenceColumnName
)ONDELETECASCADE;
');
COMMIT ENDTRY
BEGINCATCH
=====>can '' tswitch toCASCADE,- +
CAST(ERROR_NUMBER() AS VARCHAR) - +ERROR_MESSAGE();
ROLLBACK ENDCATCH;

@ReferenceColumnName;
END;

CLOSEDataBaseTableRelationships;
DEALLOCATEDataBaseTableRelationships;

END
'';
'';

@TableName;
CLOSEDataBaseTables0;
DEALLOCATEDataBaseTables0;

LoopthougheachtableandDELEtealldatafromthetable ')

DECLAREDataBaseTables1 OPENDataBaseTables1;

FROMDataBaseTables1
=====>deletingdatafrom[
DELETEFROM[
]
DBCCCHECKIDENT([
],RESEED,0)
tFROM[ ENDCATCH;
END

CLOSEDataBaseTables1;
DEALLOCATEDataBaseTables1;

Loopthroughalltablesandswitchallconstraintstohaveadeleteruletheyhadatthebegginingofthetask DECLAREDataBaseTables2 ASt;
OPENDataBaseTables2;

FROMDataBaseTables2
BEGIN

@ReferenceColumnName,0);">@DeleteRule;

@switchBackTo varchar( 50) =
CASE
WHEN @DeleteRule = NO_ACTION ' THEN NOACTION '
CASCADE SET_NULL SETNULL SET_DEFAULT SETDEFAULT to @switchBackTo;


)ONDELETE
@switchBackTo
');

tchange backto ,255);">FROMDataBaseTableRelationships
@DeleteRule;
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: [email protected]本博文欢迎大家浏览和转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,在『参考』的文章中,我会表明参考的文章来源,尊重他人版权。若您发现我侵犯了您的版权,请及时与我联系。更多文章请看[置顶]索引贴——(不断更新中)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐