(转)MSSQL中如何用SQL清除所有表的数据(downmoon)?
第一:只要数据库中表是空的;
第二:表是空的,并且自增长列可以从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)?相关推荐
- 在MySQL中如何用SQL命令创建数据库及数据表
HRELLO 大家好! 上期给大家讲解了,MySQL数据库常用的管理命令.现在,给大家讲解,如何用SQL命令在MySQL中创建一个数据库及数据表. 在学习前,我们首先要了解,SQL命令是什么? SQL ...
- 在sql server中如何用sql语句查看表结构信息?
执行如下sql: sp_help tablename; 再如: SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'APN_U ...
- PlSqlDev中执行INSERT SQL语句包含符号导致数据异常
PlSqlDev中执行INSERT SQL语句包含&符号导致数据异常 参考文章: (1)PlSqlDev中执行INSERT SQL语句包含&符号导致数据异常 (2)https://ww ...
- 如何用sql语句创建表
如何用sql语句创建表 创建一个logging表 create table logging ( id int primary key, title varchar(20), actice varcha ...
- 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 ...
- 快速清除oracle多个表,Oracle数据库之批量清除一个表的数据,TB级别数据
本文主要向大家介绍了Oracle数据库之批量清除一个表的数据,TB级别数据,通过具体的内容向大家展现,希望对大家学习Oracle数据库有所帮助. 有个需求,要求清理8TB的数据,只保留一个月的数据,现 ...
- 如何用VBA从EXCEL表取数据?问题1:1次性整体写入,还是循环写入数组呢? 问题2:取得数据后如何定位需要的那个?
1问题 1.1 如何用VBA从EXCEL表取数据? 有时候只是要把EXCEL表的数据读到VBA里 经常,我们需要读入EXCEL的数据,且能明确的知道每列的意义,并且根据某一列(比如 id列/ inde ...
- SQL(创建新表导入数据)
创建新表导入数据 1 在数据库中创建一个新的数据库,命名. 2 命名之后在数据库文件选择路径,两个都要确定. 3 在新建的数据库中新建一个表,添加所需要的数据后, 要设计一个ID:在ID列名设计主键, ...
- SQL 从一个表读取数据存到另一个表
原来没有的创建的表 select * into 表A form 表B where条件 原来存在的表 insert into 表A select * from 表B where 条件 INSERT IN ...
最新文章
- 设置Golang的GOPATH
- 携程CEO称成功来自传统营销 B2C已经过时
- 关于NSKeyedArchiver的编码格式
- OSI/RM 开放系统互联参考模型
- 轻松搭建一个Windows SVN服务器
- 简单易用的IT运维服务器管理程序分享!
- 匿名函数php作用,PHP匿名函数可以干什么用
- 使用MybatisPlus在实体中添加数据库表中不存在的字段
- Android【报错】java.lang.ClassCastException: android.widget.TextView cannot be cast to android.widget.Bu
- iOS UDP和TCP测试工具sokit
- GTQ服务多层次金融衍生品市场,促进社会经济繁荣
- 运行 Clojure 编程实战 5.3 节代码出现 Could not locate Clojure resource on classpath 问题
- Unity3D学习——使用PUN写一个聊天功能
- UVa 437 巴比伦塔(The Tower of Babylon)
- 转 爬虫与反爬虫套路
- 苹果6电池价格_苹果8plus电池不耐用,苹果8p换电池价格
- 蚂蚁金融科技:两大发布,实力开放
- 书架html5,基于HTML5 Canvas的CSG构造实体几何书架
- python图片水印
- shell 中字符串变量处理