15. SQL -- 游标(实例)

为什么使用游标:

  • 普通查询:把集合或多集作为一个整体来处理,不依赖任何顺序;
  • 游标对象查询:它用来处理查询返回的结果集中的各行,以指定的顺序一次只处理一行;

使用游标的步骤:

  1. 在某个查询的基础上声明游标;
  2. 打开游标;
  3. 从第一个游标记录中把列值提取到指定的变量;
  4. 当还没有超出游标的最后一行时(@@FETCH_STATUS函数的返回值是0),循环遍历游标记录:在每一次遍历中,从当前游标记录中把列值提取到指定的变量,再为当前行执行相应的处理。
  5. 关闭游标;
  6. 释放游标;

例子 : 使用游标来计算Sales.CustOrders视图中每个客户每个月的连续总订货量:

--(代码逻辑:

-- 声明游标 --从CustOrder视图中按客户ID和订单月份的顺序返回基本数据行;

--通过循环来遍历每个记录,代码不断跟踪客户的当前连续订货量,并将值保存在变量@runqty中,每次找到一个客户,重置该变量。再把客户ID,订单月份,当前月订货量,当前月的连续订货量作为一行插入到表变量@result中。

[email protected] : 当月的订货量

[email protected]: 当前月的连续订货量

--当完成游标的所有记录后,再查询表变量以显示生成的连续聚合值。

--)

Set nocount on  --不返回T-SQL 影响的行数,计数;

UseTSQLFundamentals2008

Declare @result table

(

Custid int,

Ordermonth datetime,

Qty int,

Runqty int,

Primary key(custid,ordermonth)

);

Declare

@custid as int,

@prvcustid as int,

@ordermonth datetime,

@qty as int,

@runqty as int;

--Step 1:在某个查询的基础上声明游标

Declare C Cursor fast_forward /*read only, forward only*/ for

Select custid, ordermonth, qty

From sales.custorders

Order by custid, ordermonth;

--Step 2: 打开游标

Open C

--Step 3: 从第一个游标记录中把列值提取到指定的变量;

FETCH NEXT FROM C  INTO @custid, @ordermonth, @qty;

Select @prvcustid=@custid, @runqty=0;

--Step 4: 当还没有超出游标的最后一行时(@@FETCH_STATUS函数的返回值是0),循环遍历游标记录:在每一次遍历中,从当前游标记录中把列值提取到指定的变量,再为当前行执行相应的处理。

WHILE @@FETCH_STATUS = 0

BEGIN

IF @custid <> @prvcustid

Select@prvcustid = @custid,@runqty=0;

Set @runqty =@runqty +@qty;

Insert into @result values(@custid,@ordermonth,@qty,@runqty);

Fetch next from C INTO @custid,@ordermonth, @qty

END

--Step 5: 关闭游标;

CLOSE C;

--Step 4: 释放游标;

DEALLOCATE C;

--当完成游标的所有记录后,再查询表变量以显示生成的连续聚合值。

Select

Custid,

Convert(varchar(7),ordermonth,121) as ordermonth,

Qty,

Runqty

From @result

Order by custid, ordermonth;

时间: 2024-12-13 01:55:28

15. SQL -- 游标(实例)的相关文章

SQL触发器实例(下)

1 基本语法: 2 Create Trigger [TriggerName] 3 ON [TableName] 4 FOR [Insert][,Delete][,Update] 5 AS 6 --触发器要执行的操作语句. 7 Go 8 9 注意: 10 触发器中不允许以下 Transact-SQL 语句: 11 Alter DATABASE ,Create DATABASE,DISK INIT, 12 DISK RESIZE, Drop DATABASE, LOAD DATABASE, 13 L

MySQL管理之SQL语句实例

MySQL管理之SQL语句实例 首先,我们来导入world库,这个world库中的表是mysql ocp考试专用表,在网上有下 mysql> source/root/world_innodb.sql 表结构如下: 本文来自http://yijiu.blog.51cto.com 转载请经博主允许 ,盗帖可耻! CREATE TABLE `Country` (  `Code` char(3) NOT NULL DEFAULT '',  `Name` char(52) NOT NULL DEFAULT

SQL触发器实例讲解

定义: 何为触发器?在SQL Server里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序.触发器是一个特殊的存储过程.       常见的触发器有三种:分别应用于Insert , Update , Delete 事件. 我为什么要使用触发器?比如,这么两个表: Create Table Student(              --学生表         StudentID int primary key,       --学号         ....        )

从一个小例子认识SQL游标

原文:从一个小例子认识SQL游标 1    什么是游标: 关系数据库中的操作会对整个行集起作用. 例如,由 SELECT 语句返回的行集包括满足该语句的 WHERE 子句中条件的所有行. 这种由语句返回的完整行集称为结果集. 应用程序,特别是交互式联机应用程序,并不总能将整个结果集作为一个单元来有效地处理. 这些应用程序需要一种机制以便每次处理一行或一部分行. 游标就是提供这种机制的对结果集的一种扩展. 游标通过以下方式来扩展结果处理: 允许定位在结果集的特定行. 从结果集的当前位置检索一行或一

SQL语句实例

SQL语句实例 表操作    例 1  对于表的教学管理数据库中的表 STUDENTS ,可以定义如下: CREATE  TABLE  STUDENTS (SNO      NUMERIC (6, 0) NOT NULL SNAME    CHAR (8) NOT NULL AGE      NUMERIC(3,0) SEX      CHAR(2) BPLACE  CHAR(20) PRIMARY KEY(SNO)) 例 2  对于表的教学管理数据库中的表 ENROLLS ,可以定义如下: C

[15]SQL 连接(JOIN)

[15]SQL 连接(JOIN) SQL join 用于把来自两个或多个表的行结合起来. SQL JOIN 子句用于把来自两个或多个表的行结合起来,基于这些表之间的共同字段. 最常见的 JOIN 类型:SQL INNER JOIN(简单的 JOIN). SQL INNER JOIN 从多个表中返回满足 JOIN 条件的所有行. 下面是选自 "Websites" 表的数据: +----+--------------+---------------------------+-------+

sql语句代编写、sql 游标 、事务代写

sql语句代编写.sql 游标 .事务代写1. AimsThis project aims to give you practice in? reading and understanding a moderately large relational schema (MyMyUNSW)? implementing SQL queries and views to satisfy requests for information? implementing SQL functions to ai

SQL语句实例集合

SQL语句实例 表操作     例 1  对于表的教学管理数据库中的表 STUDENTS ,可以定义如下: CREATE  TABLE  STUDENTS (SNO      NUMERIC (6, 0) NOT NULL SNAME    CHAR (8) NOT NULL AGE      NUMERIC(3,0) SEX      CHAR(2) BPLACE  CHAR(20) PRIMARY KEY(SNO)) 例 2  对于表的教学管理数据库中的表 ENROLLS ,可以定义如下:

第8章 配置 SQL Server 实例

第8章  配置 SQL Server 实例 8.1  查看常规属性 8.2  配置内存属性 8.3  配置处理器属性 8.4  配置安全性属性 8.5  配置连接属性 8.6  配置数据库设置属性 8.7  配置高级属性 8.8  配置权限属性