关于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参数
经验在于积累----武二郎