欢迎来到HELLO素材网! 南京网站制作选择顺炫科技
丰富的DIV CSS模版、JS,jQuery特效免费提供下载
当前位置:主页 > 建站教程 > 服务器教程 >

[最佳方案]删除SQLServer数据库中所有表,视图,存储过程以及数据最佳方案

发表于2017-03-21 18:53| 次阅读| 来源原创| 作者session

摘要:Sqlserver数据库删除方案我在网上找了很多,基本上都不能完全解决问题,有的可以删除所有表,但是里面的视图,存储过程不能删除,有的这些都删除了发现数据库的容量还是非常大。

Sqlserver数据库删除方案我在网上找了很多,基本上都不能完全解决问题,有的可以删除所有表,但是里面的视图,存储过程不能删除,有的这些都删除了发现数据库的容量还是非常大。

经过我的不断努力,不断查阅资料,我发现了一个非常好的方法,请参照以下方案:

方案1:

第一种方案是你的数据库中没有什么外键约束,请按照方案一来实现:如下

sqlserver删除数据库中所有的表

-------------------------------------------------------------------------------------------

打开Sql server management studio并新建一个查询,在打开的xxx.sql文件中输入:


exec
sp_MSforeachtable @command1='Delete from ?'
exec
sp_MSforeachtable @command1 = "TRUNCATE TABLE ?"

然后执行语句。


以上为分隔符号

方案2:

第二种方案是你的数据库中如果由于外键约束删除table失败,则先删除所有约束:

方案2分为3步走(第二步比较长,看完后记得看重要的第三步):

--/第1步**********删除所有表的外键约束*************************/

DECLARE c1 cursor for
select 'alter table ['+ object_name(parent_obj) + '] drop constraint ['+name+']; '
from sysobjects
where xtype = 'F'
open c1
declare @c1 varchar(8000)
fetch next from c1 into @c1
while(@@fetch_status=0)
begin
exec(@c1)
fetch next from c1 into @c1
end
close c1
deallocate c1

--/第2步**********删除所有表*************************/

use 数据库名(是要删除表的所在的那个数据库的名称)
GO
declare @sql varchar(8000)
while (select count(*) from sysobjects where type='U')>0
begin
SELECT @sql='drop table ' + name
FROM sysobjects
WHERE (type = 'U')
ORDER BY 'drop table ' + name
exec(@sql)
End

删除所有的存储过程同理可得,但不需要走第一步,只需将第2步的代码的where xtype='U' 改成 where xtype='P',drop table 改成 drop Procedure

sysobjects的xtype代表含义:

在数据库内创建的每个对象(约束、默认值、日志、规则、存储过程等)在表中占一行。只有在 tempdb 内,每个临时对象才在该表中占一行。

列名 数据类型 描述

name sysname 对象名。

Id int 对象标识号。

xtype char(2) 对象类型。可以是下列对象类型中的一种:

C = CHECK 约束

D = 默认值或 DEFAULT 约束

F = FOREIGN KEY 约束

L = 日志

FN = 标量函数

IF = 内嵌表函数

P = 存储过程

PK = PRIMARY KEY 约束(类型是 K)

RF = 复制筛选存储过程

S = 系统表

TF = 表函数

TR = 触发器

U = 用户表

UQ = UNIQUE 约束(类型是 K)

V = 视图

X = 扩展存储过程

uid smallint 所有者对象的用户 ID。

info smallint 保留。仅限内部使用。

status int 保留。仅限内部使用。

base_schema_

ver int 保留。仅限内部使用。

replinfo int 保留。供复制使用。

parent_obj int 父对象的对象标识号(例如,对于触发器或约束,该标识号为表 ID)。

crdate datetime 对象的创建日期。

ftcatid smallint 为全文索引注册的所有用户表的全文目录标识符,对于没有注册的所有用户表则为 0。

schema_ver int 版本号,该版本号在每次表的架构更改时都增加。

stats_schema_

ver int 保留。仅限内部使用。

type char(2) 对象类型。可以是下列值之一:

C = CHECK 约束

D = 默认值或 DEFAULT 约束

F = FOREIGN KEY 约束

FN = 标量函数

IF = 内嵌表函数

K = PRIMARY KEY 或 UNIQUE 约束

L = 日志

P = 存储过程

R = 规则

RF = 复制筛选存储过程

S = 系统表

TF = 表函数

TR = 触发器

U = 用户表

V = 视图

X = 扩展存储过程

userstat smallint 保留。

sysstat smallint 内部状态信息。

indexdel smallint 保留。

refdate datetime 留作以后使用。

version int 留作以后使用。

deltrig int 保留。

instrig int 保留。

updtrig int 保留。

seltrig int 保留。

category int 用于发布、约束和标识。

cache smallint 保留。

前面2步完成了后,SQL数据库容量的问题,把数据清空,数据库容量还是那么大,按照步骤三来一次,发现正常了。

--/第三步**********收缩数据库已经数据库日志*************************/

--收缩数据库
USE DBNAME
GO
DBCC SHRINKDATABASE(N'DBNAME' )
GO
--收缩数据库文件
USE DBNAME
GO
DBCC SHRINKFILE (N'数据文件名' , 0, TRUNCATEONLY)
GO
这样,数据库才真正意义上的清空了,这个是针对服务器上的数据库清空处理方法,如果有权限的话最直接的方法是删除整个数据库重新建数据库就可以了。


有问题在下面留言探讨。