• [Create_Cdi]


    
    

    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
  • 相关阅读:
    Docker 容器相关命令
    Docker 镜像相关命令
    Docker 守护进程相关命令
    VMware Workstation 报w32authconnectionlaunch:readfile失败
    关于 Vue Baidu Map 自动定位
    前端面试题第一天
    记录一下使用element ui使用级联选择器的坑,级联选择器的默认选中
    判断值得类型,以及判断对象是否为空对象
    js计算两个时间差
    关于axios请求携带cookie以及封装
  • 原文地址:https://www.cnblogs.com/endv/p/5351216.html
Copyright © 2020-2023  润新知