临时表+循环+游标的小例子

原创 2012年07月16日 13:59:03

游标:

参数

NEXT

紧跟当前行返回结果行,并且当前行递增为返回行。如果 FETCH NEXT 为对游标的第一次提取操作,则返回结果集中的第一行。NEXT 为默认的游标提取选项。

PRIOR

返回紧邻当前行前面的结果行,并且当前行递减为返回行。如果 FETCH PRIOR 为对游标的第一次提取操作,则没有行返回并且游标置于第一行之前。

FIRST

返回游标中的第一行并将其作为当前行。

LAST

返回游标中的最后一行并将其作为当前行。

ABSOLUTE { n | @nvar}

如果 n@nvar 为正,则返回从游标头开始向后的第 n 行,并将返回行变成新的当前行。如果 n@nvar 为负,则返回从游标末尾开始向前的第 n 行,并将返回行变成新的当前行。如果 n@nvar 为 0,则不返回行。n 必须是整数常量,并且 @nvar 的数据类型必须为 smallinttinyint int

RELATIVE { n | @nvar}

如果 n@nvar 为正,则返回从当前行开始向后的第 n 行,并将返回行变成新的当前行。如果 n@nvar 为负,则返回从当前行开始向前的第 n 行,并将返回行变成新的当前行。如果 n@nvar 为 0,则返回当前行。在对游标进行第一次提取时,如果在将 n@nvar 设置为负数或 0 的情况下指定 FETCH RELATIVE,则不返回行。n 必须是整数常量,@nvar 的数据类型必须为 smallinttinyint int

GLOBAL

指定 cursor_name 是指全局游标。

cursor_name

要从中进行提取的打开的游标的名称。如果全局游标和局部游标都使用 cursor_name 作为它们的名称,那么指定 GLOBAL 时,cursor_name 指的是全局游标;未指定 GLOBAL 时,cursor_name 指的是局部游标。

@ cursor_variable_name

游标变量名,引用要从中进行提取操作的打开的游标。

INTO @variable_name[ ,...n]

允许将提取操作的列数据放到局部变量中。列表中的各个变量从左到右与游标结果集中的相应列相关联。各变量的数据类型必须与相应的结果集列的数据类型匹配,或是结果集列数据类型所支持的隐式转换。变量的数目必须与游标选择列表中的列数一致。

 

如果 SCROLL 选项未在 ISO 样式的 DECLARE CURSOR 语句中指定,则 NEXT 是唯一支持的 FETCH 选项。如果在 ISO 样式的 DECLARE CURSOR 语句中指定了 SCROLL 选项,则支持所有 FETCH 选项。

如果使用 Transact-SQL DECLARE 游标扩展插件,则应用下列规则:

  • 如果指定了 FORWARD_ONLY 或 FAST_FORWARD,则 NEXT 是唯一受支持的 FETCH 选项。
  • 如果未指定 DYNAMIC、FORWARD_ONLY 或 FAST_FORWARD 选项,并且指定了 KEYSET、STATIC 或 SCROLL 中的某一个,则支持所有 FETCH 选项。
  • DYNAMIC SCROLL 游标支持除 ABSOLUTE 以外的所有 FETCH 选项。

@@FETCH_STATUS 函数报告上一个 FETCH 语句的状态。相同的信息记录在由 sp_describe_cursor 返回的游标中的 fetch_status 列中。这些状态信息应该用于在对由 FETCH 语句返回的数据进行任何操作之前,以确定这些数据的有效性。有关详细信息,请参阅 @@FETCH_STATUS (Transact-SQL)

 

FETCH 权限默认授予任何有效的用户。

临时表+循环+游标的小例子

declare @BrandID int 
set @BrandID=20002
SELECT [ProductID]
      ,[BrandID]
      ,[ParentProductID]
      ,[ParentPath]
      ,[ProductName]
      ,[ProductSearchName]
      ,[ProductDescript]
      ,[CreateDate]
      ,[ProductState]
      ,[ProductType]
      ,[ProductOrder]
      ,[Module_ID]
      ,[msrepl_tran_version]
  FROM [iWOMTrackData].[dbo].[IWT_BrandProduct] where BrandID=@BrandID and ParentProductID=0
 
--临时存储
DECLARE @TempProductTable TABLE (ProductName varchar(100) )
INSERT @TempProductTable 
(ProductName)
(SELECT DISTINCT [ProductName] FROM [iWOMTrackData].[dbo].[IWT_BrandProduct] where BrandID=@BrandID and ParentProductID=0)
SELECT *  FROM @TempProductTable


--循环将行变成列
declare @i int,@total int
declare @Temp table (id int)
set @i=1
select @total=COUNT (1) from @TempProductTable
while @i<@total
begin
set @i=@i+1
end
print @i


--游标
declare @columnName varchar(100)--定义存放数据的变量
declare cur cursor--定义一个游标
read_only
for select ProductName from @TempProductTable--为所获得的数据集指定游标
open cur--打开游标
fetch next from cur into @columnName--把提取操作的列数据放到局部变量中
while(@@fetch_status=0)--返回被 FETCH 语句执行的最后游标的状态,而不是任何当前被连接打开的游标的状态。
begin
select @columnName--具体的操作
fetch next from cur into @columnName----提取下一位信息
end
close cur--关闭游标
deallocate cur--删除游标


 

 

临时表和游标的使用小总结

最近使用Db的机会比较多,现做了一些小总结: 临时表与永久表相似,但临时表存储在 tempdb 中,当不再使用时会自动删除。 临时表有局部和全局两种类型   2者比较: 局部临时表的名称以符号 (#)...
  • CQP
  • CQP
  • 2006年09月01日 00:00
  • 1569

sql server 使用循环和临时表处理数据 而不用游标

declare @thismonth datetime;--本月第一秒 SELECT @thismonth=Convert(datetime, CONVERT(nvarchar(10),dateadd...
  • hejisan
  • hejisan
  • 2017年06月28日 21:40
  • 234

sqlserver 存储过程 临时表 时间计算 循环 问题

今天要做统计网站访问量的功能。结果存储过程不会,各种系统函数也不会用。客户那边还没网络。着实憋气了。 下面是查到的一些东西 一 、临时表的使用 表名前使用一个#号,临时表是局部的,使用两个#号,临时...
  • luckysiesteven
  • luckysiesteven
  • 2015年02月02日 22:10
  • 1346

Mysql存储过程优化——使用临时表代替游标

Mysql游标在操作小数据量时比较方便,效率可观,但操作大数据量,速度比较慢,甚至直接产生系统错误。   一般说来,当操作的数据超过1万条时,就避免用游标吧。   为了测试游标...
  • Heng_Ji
  • Heng_Ji
  • 2014年07月22日 17:35
  • 5842

Oracle游标的使用方法以及使用for循环实现游标的原理

select * from tb_grade t for update    --1普通游标(显示游标)    declare    --定义游标 用于查询表结构的数据集    cursor ...
  • t0404
  • t0404
  • 2016年07月01日 23:44
  • 1205

Java调用oracle存储过程通过游标返回临时表数据

项目开发过程中,不可避免的会用到存储过程返回结果集。特别是选择Oracle做为数据库时,就更麻烦了,因为Oracle存储过程和SQLServer的有点不太一样,直接返回不了结果集,那么怎么才能在使用O...
  • qq_36617521
  • qq_36617521
  • 2017年02月22日 09:53
  • 413

sqlserver游标使用和循环

/*** 游标的使用 讲了这个多游标的优点,现在我们就亲自来揭开游标的神秘的面纱。 使用游标的顺序: 声名游标、打开游标、读取数据、关闭游标、删除游标。 1.3.1声明游标 最简单游标声明:DEC...
  • smartsmile2012
  • smartsmile2012
  • 2014年11月12日 14:50
  • 17301

oracle调用子存储过程+游标循环实例

一,有子节点的子节点的排序
  • u011518709
  • u011518709
  • 2014年11月05日 16:20
  • 1009

Java-超出打开游标的最大数

java里每次打开一个statement对象jdbc都会在数据库中打开一个游标来执行操作,做完业务后必须马上关闭,否则一旦多次打开且不关闭就会造成ORA-01000: 超出打开游标的最大数错误,如果需...
  • wodestudy
  • wodestudy
  • 2014年04月16日 23:47
  • 9726

查询产生临时表的调优

我们都知道,SQL查询时若产生了临时表,一般要消耗更多的内存,降低查找的效率。因此,当查询时产生了临时表,要进行优化,使引擎在查询时不用创建临时表就能完成查询。示例使用的是MySQL示例数据库saki...
  • qq_33290787
  • qq_33290787
  • 2016年07月18日 15:58
  • 1649
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:临时表+循环+游标的小例子
举报原因:
原因补充:

(最多只允许输入30个字)