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'
50 WHEN 'DATE' THEN 'SMALLDATETIME'
51 ELSE 'UNKNOWN'
52 END
53 SET @ls_length =
54 CASE @ls_type
55 WHEN 'CHAR' THEN ' ('+STR(@li_length)+') DEFAULT '''''
56 WHEN 'UPPER' THEN ' ('+STR(@li_length)+') DEFAULT '''''
57 WHEN 'LONG nvarchar' THEN ' DEFAULT '''''
58 WHEN 'CURRENCY' THEN ' ('+STR(@li_length)+','+STR(@li_decimal)+') DEFAULT 0'
59 WHEN 'QUANTITY' THEN ' ('+STR(@li_length)+','+STR(@li_decimal)+') DEFAULT 0'
60 WHEN 'DATE' THEN ''
61 ELSE 'UNKNOWN'
62 END
63 if @ls_check_type <> 'UNKNOWN'
64 BEGIN
65 set @ls_Alter='ALTER TABLE '+@ls_table+' ADD '+@ls_name+' '+@ls_check_type+' '+@ls_length+' '
66 execute @ls_Alter
67 END
68 fetch next from gcdf_table_cur into @ls_name,@ls_table,@ls_type,@li_length,@li_decimal
69 END
70 close gcdf_table_cur
71 deallocate gcdf_table_cur
72 set @ls_cdi_define_columns=''
73 set @ls_cdi_select_columns=''
74 set @ls_old_view=''
75 set @ls_drop=''
76 set @ls_create=''
77 set @li_first=1
78 open gcdf_view_cur
79 fetch next from gcdf_view_cur into @ls_name,@ls_table,@ls_view,@ls_type,@li_length,@li_decimal
80 WHILE @@FETCH_STATUS = 0
81 BEGIN
82 if @ls_view <> @ls_old_view
83 BEGIN
84 if @li_first = 0
85 BEGIN
86 select @ls_Syntax = sys.sysviews.viewtext from sys.sysviews
87 where sys.sysviews.viewname = @ls_old_view
88 /* sql server specific system tables */
89 select @ls_syntax = text
90 from syscomments where ID = (SELECT ID FROM sysobjects
91 WHERE Name = @ls_old_view)
92 IF @@ROWCOUNT <> 0
93 BEGIN
94 set @li_Pos=PATINDEX('%(%', @ls_Syntax)
95 set @ls_Syntax=STUFF(@ls_Syntax, @li_Pos,0,@ls_cdi_define_columns)
96 set @li_Pos=PATINDEX('% as select %', @ls_Syntax)
97 set @ls_Syntax=STUFF(@ls_Syntax, @li_Pos+10,0,@ls_cdi_select_columns)
98 set @ls_Create=@ls_create+@ls_Syntax+' '
99 set @ls_Drop=@ls_drop+' DROP VIEW '+@ls_old_view+' '
100 END
101 END
102 set @ls_cdi_define_columns=''
103 set @ls_cdi_select_columns=''
104 set @ls_old_view=@ls_view
105 set @li_first=0
106 END
107 set @ls_cdi_define_columns=@ls_cdi_define_columns+@ls_name+', '
108 set @ls_cdi_select_columns=@ls_cdi_select_columns+@ls_table+'.'+@ls_name+', '
109 fetch next from gcdf_view_cur into @ls_name,@ls_table,@ls_view,@ls_type,@li_length,@li_decimal
110 END
111 if @li_first = 0
112 BEGIN
113 select @ls_syntax = text
114 from syscomments where ID = (SELECT ID FROM sysobjects
115 WHERE Name = @ls_view)
116 IF @@ROWCOUNT <> 0
117 BEGIN
118 set @li_Pos=PATINDEX('%(%', @ls_Syntax)
119 set @ls_Syntax=STUFF(@ls_Syntax, @li_Pos,0,@ls_cdi_define_columns)
120 set @li_Pos=PATINDEX('% as select %', @ls_Syntax)
121 set @ls_Syntax=STUFF(@ls_Syntax, @li_Pos+10,0,@ls_cdi_select_columns)
122 set @ls_Create=@ls_create+@ls_Syntax+' '
123 set @ls_Drop=@ls_drop+' DROP VIEW '+@ls_view+' '
124 END
125 END
126 close gcdf_view_cur
127 deallocate gcdf_view_cur
128 if @ls_drop <> '' and @ls_create <> ''
129 BEGIN
130 execute @ls_drop
131 execute @ls_create
132 END
133 end

[Create_Cdi]的更多相关文章

随机推荐

  1. Android应用开发EditText文本内容变化监听方法

    import android.app.Activity; import android.os.Bundle; import android.text.Editable; import android. ...

  2. C语言浮点数存储方式

    对于浮点类型的数据采用单精度类型(float)和双精度类型(double)来存储,float数据占用 32bit,double数据占用 64bit.其实不论是float类型还是double类型,在计算 ...

  3. SecureCRT指南

    本文主要介绍SecureCRT的使用方法和技巧. [概念解释]什么是SSH? SSH的英文全称是Secure Shell 传统的网络服务程序,如:FTP和telnet在本质上都是不安全的, 因为它们在 ...

  4. Bzoj1407 Savage

    Description Input 第1行为一个整数N(1<=N<=15),即 野人的数目.第2行到第N+1每行为三个整数Ci, Pi, Li (1<=Ci,Pi<=100, ...

  5. [bzoj2726][SDOI2012]任务安排 ——斜率优化,动态规划,二分,代价提前计算

    题解 本题的状态很容易设计: f[i] 为到第i个物件的最小代价. 但是方程不容易设计,因为有"后效性" 有两种方法解决: 1)倒过来设计动态规划,典型的,可以设计这样的方程: d ...

  6. 借教室(NOIP2012)

    原题传送门 其实就是求能满足多少个订单.. 然后搞上差分, 又因为如果前n个能够满足,那么前m个一定能满足(m<n) 所以可以二分(重点!) 然后乱搞..就AC了(其实也挺麻烦的...233~) ...

  7. MySql实现分页查询的SQL,mysql实现分页查询的sql语句(转)

    http://blog.csdn.net/sxdtzhaoxinguo/article/details/51481430 摘要:MySQL数据库实现分页查询的SQL语句写法! 一:分页需求: 客户端通 ...

  8. react 如何处理页面加载时无法将获取缓存信息存入全局变量中

    最近在做一个权限功能时,发现在读取用户公司ID进行列表查询 时,无法钭读取到缓存中的数据存入页面全局变量中进行加载查询 将问题代码整理出来 将信息存入缓存: let menuList = Helper ...

  9. Struts2 学习笔记——struts.xml文件之Bean的配置

    Struts2的大部分核心组件不是以硬编码的形式写在代码中,而是通过自身的IoC容器来管理的. Struts2以可配置的形式来管理核心组件,所以开发者可以很容易的扩展框架的核心组件.当开发者需要扩展或 ...

  10. POJ 2914 Minimum Cut (全局最小割)

    [题目链接] http://poj.org/problem?id=2914 [题目大意] 求出一个最小边割集,使得图不连通 [题解] 利用stoerwagner算法直接求出全局最小割,即答案. [代码 ...