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

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

[推荐] (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;

DEALLOCATE DataBaseTables2;  

© 2011  EricHu

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

 

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

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] 举报,一经查实,本站将立刻删除。

相关推荐