菜单 学习猿地 - LMONKEY

VIP

开通学习猿地VIP

尊享10项VIP特权 持续新增

知识通关挑战

打卡带练!告别无效练习

接私单赚外块

VIP优先接,累计金额超百万

学习猿地私房课免费学

大厂实战课仅对VIP开放

你的一对一导师

每月可免费咨询大牛30次

领取更多软件工程师实用特权

入驻
225
0

[Create_Cdi]

原创
05/13 14:22
阅读数 78775

 

bbb

原理:游标就是把数据按照指定要求提取出相应的数据集,然后逐条进行数据处理。
1.1游标的概念
  游标(Cursor)它使用户可逐行访问由SQL Server返回的结果集。
 使用游标(cursor)的一个主要的原因就是把集合操作转换成单个记录处理方式。
 用SQL语言从数据库中检索数据后,结果放在内存的一块区域中,且结果往往是一个含有多个记录的集合。
 游标机制允许用户在SQL server内逐行地访问这些记录,按照用户自己的意愿来显示和处理这些记录。
1.2 游标的优点
从游标定义可以得到游标的如下优点,这些优点使游标在实际应用中发挥了重要作用:
   1)允许程序对由查询语句select返回的行集合中的每一行执行相同或不同的操作,而不是对整个行集合执行同一个操作。
   2)提供对基于游标位置的表中的行进行删除和更新的能力。
   3)游标实际上作为面向集合的数据库管理系统(RDBMS)和面向行的程序设计之间的桥梁,使这两种处理方式通过游标沟通起来。

1.3 游标的使用
 讲了这个多游标的优点,现在我们就亲自来揭开游标的神秘的面纱。
 使用游标的顺序: 声名游标、打开游标、读取数据、关闭游标、删除游标。
1.3.1声明游标
 最简单游标声明:DECLARE <游标名>CURSOR FOR<SELECT语句>;
 其中select语句可以是简单查询,也可以是复杂的接连查询和嵌套查询
1.3.2 打开游标
 非常简单,我们就打开刚才我们声明的游标mycursor
 OPEN mycursor
1.3.3读取数据
  FETCH [ NEXT | PRIOR | FIRST | LAST] FROM { 游标名 | @游标变量名 } [ INTO @变量名 [,…] ]
  参数说明:
  NEXT   取下一行的数据,并把下一行作为当前行(递增)。
 由于打开游标后,行指针是指向该游标第1行之前,所以第一次执行FETCH NEXT操作将取得游标集中的第1行数据。
 NEXT为默认的游标提取选项。
  INTO @变量名[,…] 把提取操作的列数据放到局部变量中。
 列表中的各个变量从左到右与游标结果集中的相应列相关联。
 各变量的数据类型必须与相应的结果列的数据类型匹配或是结果列数据类型所支持的隐性转换。
 变量的数目必须与游标选择列表中的列的数目一致。  

1.3.4关闭游标
 CLOSE mycursor
1.3.5删除游标
DEALLOCATE mycursor 

 

  1 USE [CMDEMO]
  2 GO
  3 /****** Object:  StoredProcedure [dbo].[Create_Cdi]    Script Date: 2016/4/3 23:45:57 ******/
  4 SET ANSI_NULLS ON
  5 GO
  6 SET QUOTED_IDENTIFIER ON
  7 GO
  8 ALTER procedure [dbo].[Create_Cdi]
  9  AS
 10  BEGIN    
 11      declare @ls_cdi_define_columns nvarchar(4000)
 12      declare @ls_cdi_select_columns nvarchar(4000)
 13      declare @ls_name nvarchar(20)
 14      declare @ls_table nvarchar(30)
 15      declare @ls_view nvarchar(30)
 16      declare @ls_type nvarchar(12)
 17      declare @ls_length nvarchar(40)
 18      declare @li_length integer
 19      declare @li_decimal integer
 20      declare @li_unknown smallint
 21      declare @ls_old_view nvarchar(30)
 22      declare @ls_Create nvarchar(4000)
 23      declare @ls_Drop nvarchar(4000)
 24      declare @ls_Syntax nvarchar(4000)
 25      declare @ls_Alter nvarchar(4000)
 26      declare @li_Pos integer
 27      declare @li_first smallint
 28      declare @ls_check_type nvarchar(12)
 29      declare gcdf_table_cur cursor dynamic scroll
 30          for select gcdf.cdi_name,gcdf.cdi_table,gcdf.cdi_type,gcdf.cdi_length,gcdf.cdi_decimal_places 
 31              from gcdf 
 32              order by gcdf.cdi_table asc,gcdf.colno asc
 33      declare gcdf_view_cur cursor dynamic scroll 
 34          for select gcdf.cdi_name,gcdf.cdi_table,gcdf.cdi_view,gcdf.cdi_type,gcdf.cdi_length,gcdf.cdi_decimal_places 
 35          from gcdf 
 36              where gcdf.cdi_view <> gcdf.cdi_table 
 37              order by gcdf.cdi_view asc,gcdf.colno asc
 38      open gcdf_table_cur
 39        fetch next from gcdf_table_cur into @ls_name,@ls_table,@ls_type,@li_length,@li_decimal
 40      WHILE @@FETCH_STATUS = 0 
 41        BEGIN
 42              set @li_Unknown=0
 43          SET @ls_check_type = 
 44              CASE @ls_type
 45                  WHEN 'CHAR' THEN 'VARCHAR'
 46                  WHEN 'UPPER'  THEN 'VARCHAR'
 47                  WHEN 'LONG nvarchar' THEN 'VARCHAR(4000)'
 48                  WHEN 'CURRENCY' THEN 'DECIMAL'     
 49                  WHEN 'QUANTITY' THEN 'DECIMAL'     

发表评论

0/200
225 点赞
0 评论
收藏