关于sql server动态获取数据库下所有表以及游标的简单使用

需求是这样的,在SQL SERVER中的Stock库下,有两千多张表。需要每张表都删除今天的一条错误数据。

首先得要得到所有表的名称,代码如下:

Select name FROM SysObjects Where XType='U' and name <>'InsertHistory' order BY Name ;

SysObjects是一张系统表,它会记录在数据库内创建的每个对象(约束、默认值、日志、规则、存储过程等)在表中占一行。只有在 tempdb 内,每个临时对象才在该表中占一行。 如果对SysObjects比较敢兴趣的话,可转到我之前发布的文章,SQL Server中的系统表sysobjects使用方法,实现循环遍历所有表(转)

接下来是游标的使用。

在关系数据库中,我们对于查询的思考是面向集合的。而游标打破了这一规则,游标使得我们思考方式变为逐行进行.对于类C的开发人员来着,这样的思考方式会更加舒服。

想继续了解游标的,请转:http://www.cnblogs.com/moss_tan_jun/archive/2011/11/26/2263988.html

用法请看我在下面的注释。

 1 declare @tbName varchar(20);--定义游标每一行的数据临时变量
 2 declare mycursor cursor  --定义一个全局游标,全局游标可直接赋值,但结尾必须手动释放掉。
 3 for
 4 Select name FROM SysObjects Where XType='U' and name <>'InsertHistory' order BY Name ;--为游标赋值赋值
 5 open mycursor
 6 
 7 fetch next from mycursor into @tbName; --第一行赋值给临时变量
 8 while 
 9 @@FETCH_STATUS=0
10 begin
11     exec('delete from '+@tbName+' where datediff(day,[Time],getdate())=0;');
12     fetch next from mycursor into @tbname;        
13 end 
14 --关闭游标
15 close mycursor
16 --释放游标
17 deallocate mycursor

 

最后想对使用游标时提一些建议

  •      如果能不用游标,尽量不要使用游标
  •      用完用完之后一定要关闭和释放
  •      尽量不要在大量数据上定义游标
  •      尽量不要使用游标上更新数据
  •      尽量不要使用insensitive, static和keyset这些参数定义游标
  •      如果可以,尽量使用FAST_FORWARD关键字定义游标
  •      如果只对数据进行读取,当读取时只用到FETCH NEXT选项,则最好使用FORWARD_ONLY参数
posted @ 2015-05-07 21:49  武二郎  阅读(960)  评论(0编辑  收藏  举报