`
www.zszs.net
  • 浏览: 2837 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
最近访客 更多访客>>
社区版块
存档分类
最新评论

MSSQL中如何用SQL清除所有表的数据

阅读更多
有朋友问起: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下使用通过。

方法甲:
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   

方法乙:
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 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'


助人等于自助!   3w@live.cn

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/downmoon/archive/2009/09/10/4540863.aspx
分享到:
评论

相关推荐

    使用flink-connector-sqlserver-cdc 2.3.0把数据从SQL Server实时同步到MySQL中

    本话题将详细讲解如何利用Flink的SQL Server Change Data Capture (CDC) 连接器版本2.3.0,将SQL Server中的数据实时同步到MySQL数据库。 首先,让我们了解什么是CDC。CDC是一种数据库技术,它能够捕获数据库中的...

    mysql 一条语句删除多表数据

    然而,这在删除操作中并不常见,因为通常我们不会关心数据是否存在于所有表中,而是关注特定条件下的数据。 以下是一个简单的示例,展示了如何使用INNER JOIN删除关联的两个表(表A和表B)的记录: ```sql DELETE ...

    记使用Oracle SQL Developer 迁移MySql 数据至 Oracle.docx

    总结来说,从MySQL到Oracle的数据迁移是一个涉及多个步骤的过程,需要正确配置和管理数据库环境,确保用户和表空间设置正确,并且使用像SQL Developer这样的工具来简化迁移。在迁移过程中遇到问题时,要逐一排查,如...

    通过SQL Server操作MySQL的步骤和方法

    可以使用 openquery 函数来删除 MySQL 表中的数据,例如: ```sql delete from openquery(YNK,'select * from ims_ewei_shop_sale_orders') where shop_num=@shop_num and ticket_num=@ticket_num; ``` 2.4 修改 ...

    MySQL删除表数据 MySQL清空表命令 3种方法

    `TRUNCATE TABLE` 命令是用于快速清空表中所有数据的最直接方式。它不记录单个行的删除,而是将整个表视为一个对象进行处理。由于没有触发器和日志记录,所以速度较快。但请注意,`TRUNCATE` 不是真正的删除操作,它...

    省市区数据表mysql

    总的来说,"省市区数据表mysql"涉及的核心知识点包括:MySQL数据库设计、关系型数据库的表结构设计、主键和外键的概念、数据导入导出、索引的创建与优化、以及SQL查询语句的编写和使用。理解和掌握这些知识点对于...

    PB 从SQL语句获取数据存储(MySQL)

    标题 "PB 从SQL语句获取数据存储(MySQL)" 指的是使用PowerBuilder (PB) 开发工具,通过SQL语句从MySQL数据库中检索和处理数据存储的过程。在这个Demo中,PB11.5 版本被用作开发环境,而MySQL作为后台数据库系统。...

    全球省市区sql数据,三语(中文,英文,拼音),mysql版

    标题中的“全球省市区sql数据,三语(中文,英文,拼音),mysql版”表明这是一个包含全球省份、城市和区县的数据集,特别的是,它提供了三种语言版本:中文、英文和拼音。这样的数据集通常用于多语言网站或应用的后台...

    MySQL官网测试数据上百万条数据sql文件

    SQL(Structured Query Language)是用于管理和操作数据库的标准语言,包括创建数据库、定义数据结构、插入、更新和删除数据,以及查询和分析数据等功能。在本案例中,SQL文件可能包含了CREATE TABLE语句来定义表...

    MySQL导入.sql文件及常用命令

    在 MySQL 中,可以使用 `source` 命令来导入.sql 文件。例如,假设我们有一个名为 `db.sql` 的.sql 文件,位于 `D:/myprogram/database/` 路径下,我们可以使用以下命令来导入该文件: ``` mysql&gt; source d:/my...

    mysql实例sql文件

    MySQL是一个广泛使用的开源关系型数据库管理系统(RDBMS),它基于结构化查询语言(SQL)进行数据操作。在本主题中,我们重点关注两个关键文件——`populate.sql`和`create.sql`,它们在MySQL实例中扮演着重要的角色...

    MySQL SQL语句练习题及答案

    本资源提供了 MySQL SQL 语句的练习题及答案,涵盖了创建表、插入数据、删除数据、更新数据、查询数据等多方面的知识点。 一、创建表 在 MySQL 中,创建表使用 CREATE TABLE 语句。例如,创建 student 表: ```sql...

    批量删除MySQL数据库相同前缀的数据表.rar

    在这个脚本中,可能包含了连接到MySQL数据库、查询所有具有特定前缀的数据表、并执行删除操作的逻辑。 在使用这个工具之前,确保你对数据库有完全的权限,并且已经备份了所有重要的数据。因为批量删除操作一旦执行...

    省市区字典sql-mysql-sqlserver.zip

    2. SQL语法:INSERT语句用于插入数据,SELECT语句用于查询,UPDATE用于修改数据,DELETE用于删除数据,以及JOIN操作用于联接多个表。 3. 触发器或存储过程:在某些情况下,可能需要编写触发器或存储过程来自动处理...

    实验训练1 在MySQL中创建数据库和表.docx

    "MySQL数据库创建和表创建" 本教程将指导您在MySQL中创建数据库和表,首先需要安装和配置MySQL数据库。...本教程指导您在MySQL中创建数据库和表,了解MySQL的安装和配置过程,并学习了基本的SQL语句和数据表的设计。

    现成的mysql数据库文件(商城db.sql)运行即可使用

    SQL(Structured Query Language)是用于管理关系数据库的标准编程语言,包括创建、查询、更新和删除数据等功能。 标题中的"现成的mysql数据库文件(商城db.sql)运行即可使用"表明我们得到了一个已经预设好的MySQL...

    连接mysql sqlserver的两个数据库

    此外,如果你的环境支持,还可以考虑使用中间件或数据复制服务,如MySQL的binlog replication或SQL Server的Replication功能,它们能自动保持数据库间的实时同步。 总结来说,连接MySQL和SQL Server的两个数据库...

    MySql常用sql语句

    删除数据是从一个表中删除数据,基本语法为: ```sql DELETE FROM 表名 WHERE 条件; ``` 例如,从 `Student` 表中删除 `StuId` 等于 3 的数据: ```sql DELETE FROM Student WHERE StuId = 3; ``` 修改数据 修改...

    批量删除MySQL数据库相同前缀的数据表 v1.0

    在数据库管理中,尤其是在开发和测试环境中,有时需要快速清理与特定项目或功能相关的所有表,以进行重新部署或测试。这个工具就是为了解决这样的问题而创建的。 批量删除操作通常涉及到数据库的清理和维护,对于...

    mysql 常用sql语句整理

    删除数据使用`DELETE FROM table_name WHERE condition`,注意没有`WHERE`子句会删除整个表。 接下来,我们重点讨论数据库连接: - **左连接(LEFT JOIN)**: 左连接返回左表的所有记录,即使右表中没有匹配的...

Global site tag (gtag.js) - Google Analytics