MSSQL中如何用SQL清除所有表的数据
三种类型:
第一:只要数据库中表是空的;
第二:表是空的,并且自增长列可以从1开始增长。
第三:表是空的,并且自增长列可以从1开始增长,而且存在表间的约束。
第一种类型:只要数据库中表是空的
方法一:
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
方法二:
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
方法三:
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开始增长,而且存在表间的约束。
如果执行方法一、二、三 语句时会提示:“无法截断表 ‘***’,因为该表正由 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’
转载请注明: 转载自80eye