zoukankan      html  css  js  c++  java
  • 走近SQL Server的游标

    因为有的朋友不清楚游标到底是什么?以及为什么要用,和如何用?

    这篇文章我将专门介绍这些内容

    关系数据库中的操作会对整个行集产生影响。由 SELECT 语句返回的行集包括所有满足该语句 WHERE 子句中条件的行。由语句所返回的这一完整的行集被称为结果集。应用程序,特别是交互式联机应用程序,并不总能将整个结果集作为一个单元来有效地处理。这些应用程序需要一种机制以便每次处理一行或一部分行。游标就是提供这种机制的结果集扩展。

    游标通过以下方式扩展结果处理:

    n 允许定位在结果集的特定行。

    n 从结果集的当前位置检索一行或多行。

    n 支持对结果集中当前位置的行进行数据修改。

    n 为由其他用户对显示在结果集中的数据库数据所做的更改提供不同级别的可见性支持。

    n 提供脚本、存储过程和触发器中使用的访问结果集中的数据的 Transact-SQL 语句

    游标的基本用法(遍历了Employee表中所有LastName以B开头的员工资料,这里完全就可以根据每次取到的值进行判断,然后进行相应的处理)


    DECLARE Employee_Cursor CURSOR FOR

    SELECT LastName, FirstName

    FROM Northwind.dbo.Employees

    WHERE LastName like 'B%'

    declare @LastName varchar(100),@FirstName varchar(100)

    OPEN Employee_Cursor

    FETCH NEXT FROM Employee_Cursor into @LastName,@FirstName –如果有多个字段就输出到多个变量即可

    WHILE @@FETCH_STATUS = 0

    BEGIN

    Print @LastName + '-' + @FirstName

    FETCH NEXT FROM Employee_Cursor

    END

    CLOSE Employee_Cursor

    DEALLOCATE Employee_Cursor

    更新和删除记录

    下面这个例子,对取出来的ID进行比较,如果大于1的话,就直接把这条记录删除掉。注意,这里用的条件是where current of demo_cursor,就是根据游标当前所在位置的行删除即可(假设:有一个表叫table1,里面有一个Int型的字段是ID)


    declare demo_cursor cursor for

    select ID from table1

    declare @id int

    open demo_cursor

    fetch next from demo_cursor into @id

    while @@fetch_status=0

    begin

    if @id>1

    delete from table1 where current of demo_cursor –这句代码删除当前行

    update table1 set ID=2 where current of demo_cursor—这句代码更新当前行的ID为2

    fetch next from demo_cursor into @id

    end

    close demo_cursor

    deallocate demo_cursor

    select * from table1

    总结

    游标一般只应用在服务器的存储过程中,客户端的做法就直接可以遍历RecordSet了,语法也很类似。所以,实际上可以认为游标是RecordSet遍历的一种T-SQL实现。

    (下面代码以ADO为例)

    Dim rst as New ADODB.RecordSet

    Rst.open “select * from Orders”,Connection,1,1

    If not rst.EOF then

    Do until rst.EOF

    Dosomething here

    Rst.moveNext

    Loop

    End if

    Rst.close

  • 相关阅读:
    Spring配置文件中指定init-method属性的作用
    Spring中的InitializingBean接口
    java中的instanceof用法
    mybatis中useGeneratedKeys和keyProperty的作用
    (转载)springboot集成httpinvoker的客户端
    (转载)spring 之间的远程调用-Spring Http调用的实现
    (转载)maven profile多环境自动切换配置
    (转载)使用Maven构建多模块项目
    python3 之logging模块
    python3之编码
  • 原文地址:https://www.cnblogs.com/chenxizhang/p/1269686.html
Copyright © 2011-2022 走看看