有外键约束的只有用DROP TABLE了,把建表脚本都先导出,然后删掉数据库再重建了,我都这么干的。

解决方案 »

  1.   

    CREATE PROCEDURE P_SYSTEM_DelAllUserTableData
    as
    Begin
    declare @name varchar(20)
    Declare Cur Cursor For 
         select Name from sysobjects where xtype='u' and status>=0 
    declare @SQL Varchar(20)
    Open Cur 
    Fetch Cur Into @name
    While @@FETCH_STATUS=0
             BEGIN
                    Set @sql='DELETE '+@name+''
    Exec(@sql)
                    Fetch Cur Into @name
             End
    Close Cur
    Deallocate cur
    EndGO--执行
    P_SYSTEM_DelAllUserTableData
      

  2.   

    --或者
    Exec SP_MSForEachTable @command1='TRUNCATE Table ? '
                           ,@whereand='and name<>''dtproperties'''
      

  3.   

    delete太慢了吧,有外键能用TRUNCATE清空?
      

  4.   

    Exec SP_MSForEachTable @command1='DELETE  ? '
                           ,@whereand='and name<>''dtproperties'''
      

  5.   

    --先禁用所有外键约束
    exec sp_msforeachtable "alter table ? nocheck CONSTRAINT all"--然后删除数据
    exec sp_msforeachtable @command1='truncate table ?'
                           ,@whereand='and name not like ''sys%'' 
                                       and name not in(''特殊表1'',''特殊表2'',''特殊表3'')--再启用所有外键约束
    exec sp_msforeachtable "alter table ? check constraint all"
      

  6.   

    alter table tbname nocheck CONSTRAINT all
    上面语句对外銉是没用的
    truncate table
    是不记录日志的,所以也不会触发触发器。
    建义楼主先把所有存在外鍵约束的表找出来,修改关系为级联删除,然后再执行下面语句
    exec sp_msforeachtable @command1='truncate table ?'
                           ,@whereand='and name not like ''sys%'' 
                                       and name not in(''特殊表1'',''特殊表2'',''特殊表3'')
      

  7.   

    感謝各位的回復, wgsasd311(自强不息) 的主意是很不錯,但我的數據庫中有一千多個表,并且很多表都有外鍵約束,因此這樣做的工作量非常之大。還不如生成腳本後再運行。但我還是不想用這個方法,我想寫一個具有通用性的存儲過程。目前的思路是先將所有外鍵先刪除,待清空數據後再重建所有外鍵,只是腳本還沒寫出來,也不知這樣是否可行。因此還是要麻煩大家幫忙。我相信三个臭皮匠顶一个诸葛亮。