• 关于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参数
  • 相关阅读:
    3 * 0.1 == 0.3 将会返回什么?true 还是 false?
    Java中存储金额用什么数据类型?
    oracle数据库中索引失效的几种情况
    MyBatis如何防止SQL注入
    Windows10连接到内网(局域网)段
    Linux上安装Tomcat并启动时报Cannot find /usr/local/tomcat/tomcat_8080/bin/setclasspath.sh
    Linux上安装Mysql
    Linux上安装JDK
    FileZilla的使用和注意事项
    Failure to find parent:pom:2.2.6 in http://maven.aliyun was cached in the local repository...
  • 原文地址:https://www.cnblogs.com/zhanghai/p/4486180.html
Copyright © 2020-2023  润新知