深入SQL Cursor基本用法的详细介绍_MsSql

由于这个游标 执行一下就相当于SELECT一下 其效率不敢恭维也没做深入研究。

复制代码 代码如下:

 table1结构如下
 id    int
 name  varchar(50)

 declare @id int
 declare @name varchar(50)
 declare cursor1 cursor for         --定义游标cursor1
 select * from table1               --使用游标的对象(跟据需要填入select文)
 open cursor1                       --打开游标

 fetch next from cursor1 into @id,@name  --将游标向下移1行,获取的数据放入之前定义的变量@id,@name中

 while @@fetch_status=0           --判断是否成功获取数据
 begin
 update table1 set name=name+'1'
 where id=@id                           --进行相应处理(跟据需要填入SQL文)

 fetch next from cursor1 into @id,@name  --将游标向下移1行
 end

 close cursor1                   --关闭游标
 deallocate cursor1

游标一般格式:
DECLARE 游标名称 CURSOR FOR SELECT 字段1,字段2,字段3,... FROM 表名 WHERE ...
OPEN 游标名称
FETCH NEXT FROM 游标名称 INTO 变量名1,变量名2,变量名3,...
WHILE @@FETCH_STATUS=0
        BEGIN
                  SQL语句执行过程... ...
                  FETCH NEXT FROM 游标名称 INTO 变量名1,变量名2,变量名3,...
        END
CLOSE 游标名称
DEALLOCATE 游标名称 (删除游标)

复制代码 代码如下:

例子:
/*
功能:数据库表格tbl_users数据
deptid userid username
1          100      a
1      101      b
2      102      c
要求用一个sql语句输出下面结果
deptid username
1        ab
2        c
[要求用游标实现设计: OK_008
时间: 2006-05
备注:无
*/
create table #Temp1(deptid int,userid int,username varchar(20)) --待测试的数据表
create table #Temp2(deptid int,username varchar(20))                --结果表
--先把一些待测试的数据插入到待测试表#Temp1中
insert into #Temp1
select 1,100,'a' union all
select 1,101,'b' union all
select 1,131,'d' union all
select 1,201,'f' union all
select 2,302,'c' union all
select 2,202,'a' union all
select 2,221,'e' union all
select 3,102,'y' union all
select 3,302,'e' union all
select 3,121,'t'
--
declare @deptid int,@username varchar(20)
--定义游标
declare Select_cursor cursor for
        select deptid,username from #Temp1
open Select_cursor
fetch next from Select_cursor into @deptid,@username    --提取操作的列数据放到局部变量中
while @@fetch_status=0      --返回被 FETCH 语句执行的最后游标的状态
/*
@@FETCH_STATUS =0          FETCH 语句成功
@@FETCH_STATUS =-1 FETCH 语句失败或此行不在结果集中
@@FETCH_STATUS =-2 被提取的行不存在
*/
        begin
                  --当表#Temp2列deptid存在相同的数据时,就直接在列username上追加@username值
                  if(exists(select * from #Temp2 where deptid=@deptid ))
                          update #Temp2 set username=username +@username where deptid=@deptid
                  else
                  --插入新数据
                          insert into #Temp2 select @deptid,@username
                  fetch next from Select_cursor into @deptid,@username
        end
close Select_cursor     
deallocate Select_cursor
select * from #Temp2 --测试结果
Drop table #Temp1,#Temp2

时间: 2024-10-08 11:54:52

深入SQL Cursor基本用法的详细介绍_MsSql的相关文章

深入SQL Cursor基本用法的详细介绍

由于这个游标 执行一下就相当于SELECT一下 其效率不敢恭维也没做深入研究. 复制代码 代码如下:  table1结构如下  id    int  name  varchar(50) declare @id int  declare @name varchar(50)  declare cursor1 cursor for         --定义游标cursor1  select * from table1               --使用游标的对象(跟据需要填入select文)  op

SQL Server 日期相关资料详细介绍_MsSql

一.日期类型: 对于SQL Server 2008 来说(因为2000甚至2005已经稍微有被淘汰的迹象,所以在此不作过多说明,加上自己工作使用的是2008R2.所以不保证08以前的能用),日期类型有: 数据类型 格式 范围 精确度 存储大小(以字节为单位) 用户定义的秒的小数精度 时区偏移量 time   hh:mm:ss[. nnnnnnn] 00:00:00.0000000 到 23:59:59.9999999 100 纳秒 3 到 5 是 否 date   YYYY-MM-DD 0001

SQL Server 数据库的备份详细介绍及注意事项_Mysql

SQL Server 备份 前言 为什么要备份?理由很简单--为了还原/恢复.当然,如果不备份,还可以通过磁盘恢复来找回丢失的文件,不过SQL Server很生气,后果很严重.到时候你就知道为什么先叫你备份一次再开始看文章了.∩__∩.本系列将介绍SQL Server所有可用的备份还原功能,并尽可能用实例说话. 什么是备份?SQL Server基于Windows,以文件形式存放资料,所以备份就是Windows上SQL Server相关文件的一个某个时间点的副本.根据备份类型的不同,副本的种类和内

SQL 多条件查询几种实现方法详细介绍_MsSql

SQL 多条件查询 以后我们做多条件查询,一种是排列结合,另一种是动态拼接SQL 如:我们要有两个条件,一个日期@addDate,一个是@name 第一种写法是 if (@addDate is not null) and (@name <> '') select * from table where addDate = @addDate and name = @name else if (@addDate is not null) and (@name ='') select * from t

Sql Server中的DBCC命令详细介绍_MsSql

     今天研发中心办年会,晚上就是各自部门聚餐了,我个人喜欢喝干红,在干红中你可以体味到那种酸甜苦辣...人生何尝不是这样呢???正好ceo从美国带了干红回来,然后我就顺道开心的过了把瘾....一个字...爽....喝着有点多...到现在头还疼....回来地铁上想这个周末忙着找房子,书一点都没看,也没在博客上接着忽悠,想起了上篇博客有个哥们说普及普及DBCC,虽然有点迷迷糊糊的...看能不能写出点新花样....不管学什么语言,还是数据库,你得看的比人家深一层...最可悲的就是停留的在表层,这

SQL中JOIN和UNION区别、用法及示例介绍_MsSql

1.JOIN和UNION区别 join 是两张表做交连后里面条件相同的部分记录产生一个记录集, union是产生的两个记录集(字段要一样的)并在一起,成为一个新的记录集 . JOIN用于按照ON条件联接两个表,主要有四种: INNER JOIN:内部联接两个表中的记录,仅当至少有一个同属于两表的行符合联接条件时,内联接才返回行.我理解的是只要记录不符合ON条件,就不会显示在结果集内. LEFT JOIN / LEFT OUTER JOIN:外部联接两个表中的记录,并包含左表中的全部记录.如果左表

SQL Server 2005 数据库复制详细介绍_mssql2005

对于一个地域分散的大型企业组织来说,构建具有典型的分布式计算机特征的大型企业管理信息系统时,总要解决一个很重要的问题:如何在多个不同数据库服务器之间保证共享数据的一致性.之所以有这个重要的问题在于企业组织在不同地点对具有相同结构的本地数据库进行修改,但要保证修改后的数据库有相同的结果,其本质就是在对本地数据库的修改体现在其他具有相同数据的远程数据库中.那么如何解决这个问题就要用到数据库的复制技术. SQL SERVER提供了内置的复制能力,复制组件并不是附加产品,而是核心引擎的一部分.在复制这个

在SQL Server 2005中创建CLR存储过程的详细介绍_MsSql

在2005之前的版本创建存储过程都是在数据库里面写Transact-SQL语言实现的,不过现在SQL Server 2005支持用其他面向对象的语言编写CLR存储过程了,关于这样做的好处,官方有很多解释了,这里就直接说明实现方法了. 假设服务器里面有个test数据库,数据库有个架构user,还有一个表test1,然后有个sql登陆用户叫test_user,将这个用户设置成VS2005里面数据库连接的登陆用户. 在VS2005中创建一个项目,类别是SQL Server数据库项目,然后往项目里面添加

Sql Server中的系统视图详细介绍_MsSql

本来想这个系列写点什么好呢,后来想想大家作为程序员,用的最多的莫过于数据库了,但是事实上很多像我这样工作在一线的码农,对sql都一知半解,别谈优化和对数据库底层的认识了,我也是这样...  一:那些系统视图 1. 系统视图是干什么呢? 从名字上看就知道,系统视图嘛?猜的不错的话,就是存放一些sqlserver系统的一些信息,很好,恭喜你,答对了.  2. 都定义在哪呢?  为了让你眼见为实,下面截图看看,从截图中你可以看到,不管是"系统数据库"还是"用户数据库"都是