[推荐] (sqlServer)批量清理指定数据库中所有数据
——通过知识共享树立个人品牌。
在实际应用中,当我们准备把一个项目移交至客户手中使用时,我们需要把库中所有表先前的测试数据清空,以给客户一个干净的数据库,如果涉及的表很多,要一一的清空,不仅花费时间,还容易出错以及漏删,在这儿我提供了一个方法,可快捷有效的清空指定数据库所有表的数据。仅供参考,欢迎交流不同意见。
--
Remove all data from a database
SET NOCOUNT ON
Tables to ignore
DECLARE @IgnoreTables
TABLE (TableName varchar( 512))
INSERT INTO @IgnoreTables (TableName) VALUES ( ' sysdiagrams ')
@AllRelationships
TABLE (ForeignKey varchar( 512)
,TableName @AllRelationships
SELECT f.name AS ForeignKey,
OBJECT_NAME(f.parent_object_id) AS TableName,255)">COL_NAME(fc.parent_object_id,
fc.parent_column_id) AS ColumnName,255)">OBJECT_NAME (f.referenced_object_id) AS ReferenceTableName,255)">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
@TableOwner varchar( 512)
@TableName @ForeignKey @ColumnName @ReferenceTableName @ReferenceColumnName @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
@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 FOR
SELECT ForeignKey, ColumnName, ReferenceTableName, ReferenceColumnName
@TableName
OPEN DataBaseTableRelationships;
FROM DataBaseTableRelationships @ForeignKey, @ColumnName,0)">@ReferenceTableName,0)">@ReferenceColumnName;
IF @@FETCH_STATUS <> 0
=====> No Relationships ' ;
= 0
BEGIN
=====> switching delete rule on @ForeignKey to CASCADE ';
BEGIN TRANSACTION
BEGIN TRY
EXEC(
ALTER TABLE [ ]
DROP CONSTRAINT @ForeignKey ;
ALTER TABLE [ ] ADD CONSTRAINT
FOREIGN KEY
(
@ColumnName
) REFERENCES @ReferenceTableName
(
@ReferenceColumnName
) ON DELETE CASCADE;
');
COMMIT END TRY
BEGIN CATCH
=====> can '' t switch to CASCADE, - @H_404_402@+
CAST(ERROR_NUMBER() AS VARCHAR) - @H_404_402@+ ERROR_MESSAGE();
ROLLBACK END CATCH;
@ReferenceColumnName;
END;
CLOSE DataBaseTableRelationships;
DEALLOCATE DataBaseTableRelationships;
END
'';
'';
FROM DataBaseTables0
@TableName;
END
CLOSE DataBaseTables0;
DEALLOCATE DataBaseTables0;
Loop though each table and DELETE All data from the table ')
DECLARE DataBaseTables1 OPEN DataBaseTables1;
FROM DataBaseTables1
';
=====> deleting data from [ BEGIN TRY
DELETE FROM [ ]
DBCC CHECKIDENT ([ ], RESEED, 0)
');
END TRY
BEGIN CATCH
t FROM [ @H_404_402@+
@H_404_402@+ ERROR_MESSAGE();
END CATCH;
END
'';
'';
FROM DataBaseTables1
@TableName;
CLOSE DataBaseTables1;
DEALLOCATE DataBaseTables1;
Loop through all tables and switch all constraints to have a delete rule they had at the beggining of the task DECLARE DataBaseTables2 AS t;
OPEN DataBaseTables2;
FROM DataBaseTables2
BEGIN
BEGIN
';
FOR
@AllRelationships
@TableName
OPEN DataBaseTableRelationships;
@ReferenceColumnName,0)">@DeleteRule;
<> 0
' ;
= 0
@switchBackTo varchar( 50) =
CASE
WHEN @DeleteRule = NO_ACTION ' THEN NO ACTION '
CASCADE SET_NULL SET NULL SET_DEFAULT SET DEFAULT '
END
to @switchBackTo;
TRANSACTION
ALTER TABLE [ ]
DROP CONSTRAINT ;
ALTER TABLE [ ] ADD CONSTRAINT
FOREIGN KEY
(
) REFERENCES
(
) ON DELETE @switchBackTo
');
t change back to @switchBackTo ,128)">+
@H_404_402@+ ERROR_MESSAGE();
END CATCH;
FROM DataBaseTableRelationships
@DeleteRule;
END;
CLOSE DataBaseTableRelationships;
DEALLOCATE DataBaseTableRelationships;
END
'';
FROM DataBaseTables2
CLOSE DataBaseTables2;
SET NOCOUNT ON
Tables to ignore
DECLARE @IgnoreTables
TABLE (TableName varchar( 512))
INSERT INTO @IgnoreTables (TableName) VALUES ( ' sysdiagrams ')
@AllRelationships
TABLE (ForeignKey varchar( 512)
,TableName @AllRelationships
SELECT f.name AS ForeignKey,
OBJECT_NAME(f.parent_object_id) AS TableName,255)">COL_NAME(fc.parent_object_id,
fc.parent_column_id) AS ColumnName,255)">OBJECT_NAME (f.referenced_object_id) AS ReferenceTableName,255)">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
@TableOwner varchar( 512)
@TableName @ForeignKey @ColumnName @ReferenceTableName @ReferenceColumnName @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
@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 FOR
SELECT ForeignKey, ColumnName, ReferenceTableName, ReferenceColumnName
@TableName
OPEN DataBaseTableRelationships;
FROM DataBaseTableRelationships @ForeignKey, @ColumnName,0)">@ReferenceTableName,0)">@ReferenceColumnName;
IF @@FETCH_STATUS <> 0
=====> No Relationships ' ;
= 0
BEGIN
=====> switching delete rule on @ForeignKey to CASCADE ';
BEGIN TRANSACTION
BEGIN TRY
EXEC(
ALTER TABLE [ ]
DROP CONSTRAINT @ForeignKey ;
ALTER TABLE [ ] ADD CONSTRAINT
FOREIGN KEY
(
@ColumnName
) REFERENCES @ReferenceTableName
(
@ReferenceColumnName
) ON DELETE CASCADE;
');
COMMIT END TRY
BEGIN CATCH
=====> can '' t switch to CASCADE, - @H_404_402@+
CAST(ERROR_NUMBER() AS VARCHAR) - @H_404_402@+ ERROR_MESSAGE();
ROLLBACK END CATCH;
@ReferenceColumnName;
END;
CLOSE DataBaseTableRelationships;
DEALLOCATE DataBaseTableRelationships;
END
'';
'';
FROM DataBaseTables0
@TableName;
END
CLOSE DataBaseTables0;
DEALLOCATE DataBaseTables0;
Loop though each table and DELETE All data from the table ')
DECLARE DataBaseTables1 OPEN DataBaseTables1;
FROM DataBaseTables1
';
=====> deleting data from [ BEGIN TRY
DELETE FROM [ ]
DBCC CHECKIDENT ([ ], RESEED, 0)
');
END TRY
BEGIN CATCH
t FROM [ @H_404_402@+
@H_404_402@+ ERROR_MESSAGE();
END CATCH;
END
'';
'';
FROM DataBaseTables1
@TableName;
CLOSE DataBaseTables1;
DEALLOCATE DataBaseTables1;
Loop through all tables and switch all constraints to have a delete rule they had at the beggining of the task DECLARE DataBaseTables2 AS t;
OPEN DataBaseTables2;
FROM DataBaseTables2
BEGIN
BEGIN
';
FOR
@AllRelationships
@TableName
OPEN DataBaseTableRelationships;
@ReferenceColumnName,0)">@DeleteRule;
<> 0
' ;
= 0
@switchBackTo varchar( 50) =
CASE
WHEN @DeleteRule = NO_ACTION ' THEN NO ACTION '
CASCADE SET_NULL SET NULL SET_DEFAULT SET DEFAULT '
END
to @switchBackTo;
TRANSACTION
ALTER TABLE [ ]
DROP CONSTRAINT ;
ALTER TABLE [ ] ADD CONSTRAINT
FOREIGN KEY
(
) REFERENCES
(
) ON DELETE @switchBackTo
');
t change back to @switchBackTo ,128)">+
@H_404_402@+ ERROR_MESSAGE();
END CATCH;
FROM DataBaseTableRelationships
@DeleteRule;
END;
CLOSE DataBaseTableRelationships;
DEALLOCATE DataBaseTableRelationships;
END
'';
FROM DataBaseTables2
CLOSE DataBaseTables2;
DEALLOCATE DataBaseTables2;
© 2011 EricHu
原创作品,转贴请注明作者和出处,留此信息。
------------------------------------------------
cnBlobs:http://www.cnblogs.com/huyong/
CSDN:http://blog.csdn.net/chinahuyong
作者:EricHu(DB、C\S、B\SWebServiceWCFPM等)
出处:http://www.cnblogs.com/huyong/
Q Q:80368704 E-Mail: [email protected]本博文欢迎大家浏览和转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,在『参考』的文章中,我会表明参考的文章来源,尊重他人版权。若您发现我侵犯了您的版权,请及时与我联系。更多文章请看 [置顶]索引贴——(不断更新中)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。