有朋友问起:MSSQL中如何用SQL清除所有表的数据?这个需求分三种类型:
第一:只要数据库中表是空的;
第二:表是空的,并且自增长列可以从1开始增长。
第三:表是空的,并且自增长列可以从1开始增长,而且存在表间的约束。
邀月稍微整理了下,放在这里,便于有需要的朋友参阅。
其实,这不算什么需求。只要用数据库的生成脚本,几分钟即可生成一个干净的表结构及存储过程、视图、约束等。这里提供了另一种用SQL解决问题的方案。权当是无聊的学习,加深点印象吧。呵呵。
首先,作一些假设:假设database名为TestDB_2000_2005_2008
预先准备一些脚本


use master
go

IF OBJECT_ID('TestDB_2000_2005_2008') IS NOT NULL
-- print 'Exist databse!'
-- else print 'OK!'
DROP Database TestDB_2000_2005_2008
GO
Create database TestDB_2000_2005_2008
go
use TestDB_2000_2005_2008
go

IF OBJECT_ID('b') IS NOT NULL
drop table b 
go
create table b(id int identity(1,1),ba int,bb int)
--truncate table b 
insert into b 
select  1,1 union all
select 2,2 union all
select 1,1

IF OBJECT_ID('c') IS NOT NULL
drop table c
go
create table c(id int identity(1,1),ca int,cb int)
insert into c 
select  1,2 union all
select 1,3

先来看看第一种需求:只要数据库中表是空的。
这个其实并不难,用一个游标循环得出所有表名,再清除所有表,delete或truncate table
提供几个语句:以下语句均在SQL2000/SQL2005/SQL2008下使用通过。
方法甲:


/********************MSSQL 2000/2005/2008***********************/

use TestDB_2000_2005_2008
go
select * from b 
select * from c

Declare @t varchar (1024)
Declare @SQL varchar(2048)
Declare tbl_cur cursor for  select TABLE_NAME from INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE'
OPEN tbl_cur FETCH NEXT  from tbl_cur INTO @t

WHILE @@FETCH_STATUS = 0
BEGIN
SET @SQL='TRUNCATE TABLE '+ @t
--print (@SQL)
EXEC (@SQL)
FETCH NEXT  from tbl_cur INTO @t
END

CLOSE tbl_cur
DEALLOCATE tbl_Cur

select * from b 
select * from c

方法乙:


/********************MSSQL 2000/2005/2008***********************/
use TestDB_2000_2005_2008
go
select * from b 
select * from c 
select * from d 
select * from e 

DECLARE @TableName VARCHAR(256)
DECLARE @varSQL VARCHAR(512)
DECLARE @getTBName CURSOR SET @getTBName = CURSOR FOR SELECT name FROM sys.Tables WHERE NAME NOT LIKE 'Category'

OPEN @getTBName FETCH NEXT FROM @getTBName INTO @TableName
WHILE @@FETCH_STATUS = 0
BEGIN
SET @varSQL = 'Truncate table '+ @TableName 

--PRINT (@varSQL)
EXEC (@varSQL)
FETCH NEXT FROM @getTBName INTO @TableName
END

CLOSE @getTBName
DEALLOCATE @getTBName

----select * from b 
----select * from c 

方法丙:


Declare @t table(query varchar(2000),tables varchar(100))
Insert into @t
    select 'Truncate table ['+T.table_name+']', T.Table_Name from INFORMATION_SCHEMA.TABLES T
    left outer join INFORMATION_SCHEMA.TABLE_CONSTRAINTS TC
    on T.table_name=TC.table_name
    where (TC.constraint_Type ='Foreign Key' or TC.constraint_Type is NULL) and
    T.table_name not in ('dtproperties','sysconstraints','syssegments') and
    Table_type='BASE TABLE'

Insert into @t
    select 'delete from ['+T.table_name+']', T.Table_Name from INFORMATION_SCHEMA.TABLES T
        left outer join INFORMATION_SCHEMA.TABLE_CONSTRAINTS TC
       on T.table_name=TC.table_name where TC.constraint_Type ='Primary Key' and T.table_name <>'dtproperties'and Table_type='BASE TABLE'

Declare @sql varchar(8000)
Select @sql=IsNull(@sql+' ','')+ query from @t
print(@sql)
Exec(@sql)

再来看看第二种需求:表是空的,并且自增长列可以从1开始增长
这种需求其实和第一种差不多。因为我们在以上语句中使用的是truncate table语句,所以,表的自增长列是默认从头重新的。

关键是第三种需求:表是空的,并且自增长列可以从1开始增长,而且存在表间的约束。
这是个比较头痛的问题。因为外键约束,不能使用truncate table语句,但是,如果使用delete,又不能使自增长列从1开始重排。

我们不妨先来增加一些约束条件:


CREATE TABLE [d] (
    [id] [int] IDENTITY (1, 1) NOT NULL ,
    [da] [int] NULL ,
    [db] [int] NULL ,
    CONSTRAINT [PK_d] PRIMARY KEY  CLUSTERED 
    (
        [id]
    )  ON [PRIMARY] 
) ON [PRIMARY]

CREATE TABLE [e] (
    [id] [int] IDENTITY (1, 1) NOT NULL ,
    [da] [int] NULL ,
    [db] [int] NULL ,
    [did] [int] NULL ,
    CONSTRAINT [FK_e_d] FOREIGN KEY 
    (
        [did]
    ) REFERENCES [d] (
        [id]
    )
) ON [PRIMARY]

insert into d
select 5,6 union all
select 7,8 union all
select 9,9

insert into e
select 8,6,1 union all
select 8,8,2 union all
select 8,9,2

此时再来执行甲乙丙语句时会提示:“无法截断表 'd',因为该表正由 FOREIGN KEY 约束引用。”

我们可以这样设想:
1、先找出没有外键约束的表,truncate
2、有外键的表,先delete,再复位identity列
于是得出,
语句丁(注意没有使用游标


 SET NoCount ON
   DECLARE @tableName varchar(512)
   Declare @SQL varchar(2048)
   SET @tableName=''
   WHILE NOT EXISTS
   (   
   --Find all child tables and those which have no relations
   SELECT T.table_name   FROM INFORMATION_SCHEMA.TABLES T
          LEFT OUTER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS TC    ON T.table_name = TC.table_name
     WHERE ( TC.constraint_Type = 'Foreign Key' OR TC.constraint_Type IS NULL )
         AND T.table_name NOT IN ( 'dtproperties', 'sysconstraints', 'syssegments' )
         AND Table_type = 'BASE TABLE'
         AND T.table_name > @TableName
         )
    Begin
        SELECT @tableName = min(T.table_name)    FROM INFORMATION_SCHEMA.TABLES T
        LEFT OUTER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS TC    ON T.table_name=TC.table_name
           WHERE ( TC.constraint_Type = 'Foreign Key' OR TC.constraint_Type IS NULL )
         AND T.table_name NOT IN ( 'dtproperties', 'sysconstraints', 'syssegments' )
         AND Table_type = 'BASE TABLE'
         AND T.table_name > @TableName
         --Truncate the table
         SET @SQL = 'Truncate table '+ @TableName 
         print (@SQL)
         Exec(@SQL)
     End
  
   SET @TableName=''
   WHILE EXISTS
   ( 
   --Find all Parent tables
     SELECT T.table_name     FROM INFORMATION_SCHEMA.TABLES T
     LEFT OUTER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS TC     ON T.table_name = TC.table_name
     WHERE TC.constraint_Type = 'Primary Key'
     AND T.table_name <> 'dtproperties'
     AND Table_type='BASE TABLE'
     AND T.table_name > @TableName
     )
   Begin
     SELECT @tableName = min(T.table_name)   FROM INFORMATION_SCHEMA.TABLES T
          LEFT OUTER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS TC   ON T.table_name=TC.table_name
     WHERE TC.constraint_Type = 'Primary Key'
     AND T.table_name <> 'dtproperties'
     AND Table_type = 'BASE TABLE'
     AND T.table_name > @TableName
     --Delete the table
    
        SET @SQL = ' delete from '+ @TableName 
         print (@SQL)
         Exec(@SQL)
     --Reset identity column
         IF EXISTS ( SELECT *   FROM INFORMATION_SCHEMA.COLUMNS
             WHERE COLUMNPROPERTY(
             OBJECT_ID( QUOTENAME(table_schema)+ '.' + QUOTENAME(@tableName) ),
             column_name,'IsIdentity'
             ) = 1
           )

     DBCC CHECKIDENT(@tableName,RESEED,0)
   End
   SET NoCount OFF

小结:除了以上方法,还可以临时禁用外键约束。语句为:

-- --禁用所有约束
--exec sp_msforeachtable 'alter table ? nocheck CONSTRAINT all'
-- --再启用所有外键约束
--exec sp_msforeachtable 'alter table ? check constraint all'

另外一种:

EXEC sp_MSforeachtable "truncate table ?"

转载于:https://www.cnblogs.com/s021368/articles/1640316.html

(转)MSSQL中如何用SQL清除所有表的数据(downmoon)?相关推荐

  1. 在MySQL中如何用SQL命令创建数据库及数据表

    HRELLO 大家好! 上期给大家讲解了,MySQL数据库常用的管理命令.现在,给大家讲解,如何用SQL命令在MySQL中创建一个数据库及数据表. 在学习前,我们首先要了解,SQL命令是什么? SQL ...

  2. 在sql server中如何用sql语句查看表结构信息?

    执行如下sql: sp_help  tablename; 再如: SELECT  * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'APN_U ...

  3. PlSqlDev中执行INSERT SQL语句包含符号导致数据异常

    PlSqlDev中执行INSERT SQL语句包含&符号导致数据异常 参考文章: (1)PlSqlDev中执行INSERT SQL语句包含&符号导致数据异常 (2)https://ww ...

  4. 如何用sql语句创建表

    如何用sql语句创建表 创建一个logging表 create table logging ( id int primary key, title varchar(20), actice varcha ...

  5. java实现将A表数据转移到B表_解决用B表跟新A表数据,如果A表中没有,则把B表的数据插入A表(merge into)...

    作用:merge into 解决用B表跟新A表数据,如果A表中没有,则把B表的数据插入A表: 语法: MERGE INTO [your table-name] [rename your table h ...

  6. 快速清除oracle多个表,Oracle数据库之批量清除一个表的数据,TB级别数据

    本文主要向大家介绍了Oracle数据库之批量清除一个表的数据,TB级别数据,通过具体的内容向大家展现,希望对大家学习Oracle数据库有所帮助. 有个需求,要求清理8TB的数据,只保留一个月的数据,现 ...

  7. 如何用VBA从EXCEL表取数据?问题1:1次性整体写入,还是循环写入数组呢? 问题2:取得数据后如何定位需要的那个?

    1问题 1.1 如何用VBA从EXCEL表取数据? 有时候只是要把EXCEL表的数据读到VBA里 经常,我们需要读入EXCEL的数据,且能明确的知道每列的意义,并且根据某一列(比如 id列/ inde ...

  8. SQL(创建新表导入数据)

    创建新表导入数据 1 在数据库中创建一个新的数据库,命名. 2 命名之后在数据库文件选择路径,两个都要确定. 3 在新建的数据库中新建一个表,添加所需要的数据后, 要设计一个ID:在ID列名设计主键, ...

  9. SQL 从一个表读取数据存到另一个表

    原来没有的创建的表 select * into 表A form 表B where条件 原来存在的表 insert into 表A select * from 表B where 条件 INSERT IN ...

最新文章

  1. 设置Golang的GOPATH
  2. 携程CEO称成功来自传统营销 B2C已经过时
  3. 关于NSKeyedArchiver的编码格式
  4. OSI/RM 开放系统互联参考模型
  5. 轻松搭建一个Windows SVN服务器
  6. 简单易用的IT运维服务器管理程序分享!
  7. 匿名函数php作用,PHP匿名函数可以干什么用
  8. 使用MybatisPlus在实体中添加数据库表中不存在的字段
  9. Android【报错】java.lang.ClassCastException: android.widget.TextView cannot be cast to android.widget.Bu
  10. iOS UDP和TCP测试工具sokit
  11. GTQ服务多层次金融衍生品市场,促进社会经济繁荣
  12. 运行 Clojure 编程实战 5.3 节代码出现 Could not locate Clojure resource on classpath 问题
  13. Unity3D学习——使用PUN写一个聊天功能
  14. UVa 437 巴比伦塔(The Tower of Babylon)
  15. 转 爬虫与反爬虫套路
  16. 苹果6电池价格_苹果8plus电池不耐用,苹果8p换电池价格
  17. 蚂蚁金融科技:两大发布,实力开放
  18. 书架html5,基于HTML5 Canvas的CSG构造实体几何书架
  19. python图片水印
  20. shell 中字符串变量处理

热门文章

  1. SQLite学习(三) - SQLite源代码文件结构
  2. apache服务器的配置文件httpd.conf中有很多内容,请解释如下配置项:
  3. 《深入理解计算机系统》读书笔记九:寄存器结构
  4. 前端学习记录(CSS篇)
  5. Python 内建函数
  6. 一步将 p12转为pem
  7. JavaScript正则表达式
  8. Linux IPC udp/tcp/UNIX域 socket编程
  9. spark-1.5.2集群安装
  10. 新成立的Scala中心将重点关注教育和Scala社区