一个数据库中可能有很多表,而我想全部删除,如果一个一个手动删除太麻烦而且浪费时间。
涉及两个问题:1.如何知道这个数据库里有哪些表?2.如何把这些表名读取出来?
这两个问题解决了,就方便多了。
第一个问题:
select name from sysobjects
where xtype=‘U‘
sysobjects表
在数据库内创建的每个对象(约束、默认值、日志、规则、存储过程等)在表中占一行。
xtype=‘U‘表示用户表
第二个问题:
可以把表名读取出来放到一个表变量中,然后再利用while 循环去drop table
1: declare @tabletemp TABLE (ID INT identity(1,1),NAME NVARCHAR(50));
2: declare @i int;
3: set @i=1;
4: declare @mx int;
5:
6: insert into @tabletemp
7: SELECT NAME
8: from sysobjects where xtype=‘U‘;
9:
10: set @mx=(select MAX(id) from @tabletemp);
11:
12: while (@i<=@mx)
13: begin
14: declare @name nvarchar(50)
15: select @name=name from @tabletemp where ID=@i
16: --truncate table @name 这样写是错误的,这样的话就需要@name是表类型变量
17: exec(‘truncate table ‘+@name)
18: exec(‘drop table ‘+@name)
19: set @i=@i+1
20: end
21:
也许使用游标更方便处理
使用游标
1: declare @cur cursor,@name nvarchar(50);
2: set @cur=cursor for select name from sysobjects where xtype=‘U‘
3:
4: open @cur
5: fetch next from @cur into @name
6:
7: while @@FETCH_STATUS=0
8: begin
9: exec (‘truncate table ‘+@name)
10: exec (‘drop table ‘+@name)
11: fetch next from @cur into @name
12: end
13:
14: close @cur
15: deallocate @cur
开始才网上搜到的是使用游标的方法,试着实现了。
然后试着用其他方法实现(没想到会成功),其实就是山寨下游标的思路,感觉没游标的简单。唯一惊喜也许就是使用了表变量,之前只是看过oracle中有表变量。
成功固然重要,但也不要刻意在乎,享受下一路上意外的得到!