加入收藏 | 设为首页 | 会员中心 | 我要投稿 南京站长网 (https://www.025zz.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Sql存储过程游标循环的用法及sql如何使用cursor写一个简单的循环

发布时间:2016-11-27 17:24:15 所属栏目:大数据 来源:站长网
导读:用游标,和WHILE可以遍历您的查询中的每一条记录并将要求的字段传给变量进行相应的处理 ================== DECLARE @A1 VARCHAR(10),@A2 VARCHAR(10),@A3 INTDECLARE CURSOR YOUCURNAME FOR SELECT A1,A2,A3 FROM YOUTABLENAMEOPEN YOUCURNAMEfetch next

以下的 WHILE 结构是名为 count_all_rows 过程中的一部分。下例中,该 WHILE 结构测试用于游标的函数 @@FETCH_STATUS 的返回值。因为 @@FETCH_STATUS 可能返回 –2、-1 或 0,所以,所有的情况都应进行测试。如果某一行在开始执行此存储过程以后从游标结果中删除,将跳过该行。成功提取 (0) 后将执行 BEGIN...END 循环内部的 SELECT 语句。

单变量循环

USE pubs
DECLARE tnames_cursor CURSOR
FOR
  SELECT TABLE_NAME 
  FROM INFORMATION_SCHEMA.TABLES
OPEN tnames_cursor
DECLARE @tablename sysname
--SET @tablename = 'authors'
FETCH NEXT FROM tnames_cursor INTO @tablename
WHILE (@@FETCH_STATUS lt;gt; -1)
BEGIN
  IF (@@FETCH_STATUS lt;gt; -2)
  BEGIN 
  SELECT @tablename = RTRIM(@tablename) 
  EXEC ('SELECT ''' + @tablename + ''' = count(*) FROM ' 
    + @tablename )
  PRINT ' '
 END
  FETCH NEXT FROM tnames_cursor INTO @tablename
END
CLOSE tnames_cursor
DEALLOCATE tnames_cursor

多变量循环

CREATE  PROCEDURE my_FeeCount AS
declare @到期时间  char(10)
declare @片区   char(20)
declare @缴费用户数 char(10)
declare @sql char(2000)
declare cur_data cursor for 
 select convert(varchar(10),到期时间,120) as 到期时间 ,片区,count(distinct main_id) as 缴费用户数 
 from V_aipu_fee where 提交时间gt;=convert(varchar(10),getdate()-90,120) and 提交时间lt;convert(varchar(10),getdate()+1-90,120)
 and 收费类型='续费收费'
 Group by convert(varchar(10),到期时间,120),片区
 order by convert(varchar(10),到期时间,120) 
open cur_data
fetch next from cur_data into @到期时间,@片区,@缴费用户数 
while(@@fetch_status = 0) 
begin
  set @sql='update '+RTRIM(@片区)+'实收='+RTRIM(@片区)+'实收+'+RTRIM(@缴费用户数)+' where 收费日期='''+RTRIM(@到期时间)+''''
 print @sql
 fetch next from cur_data into @到期时间,@片区,@缴费用户数 
end
close cur_data

下面接着给大家介绍sql使用cursor写一个简单的循环

1.排错

  和sql server较了一天的劲,只写了两个简单的存储过程。当然智商虽然不高还没低到这个份上。大半天都是花费在排错上了。

  System.Data.SqlClient.SqlException: SQL Server 不存在或访问被拒绝。 at

System.Data.SqlClient.ConnectionPool.GetConnection(Boolean isInTransaction) at System.Data.SqlClient.SqlConnectionPoolManager.GetPooledConnection(SqlConnectionString options, Boolean isInTransaction) at System.Data.SqlClient.SqlConnection.Open() at _20060409.WebForm1.test() in d:work files20060409webform1.aspx.cs:line 52

  冷不丁报了这个错,这个就是从程序里连不上。在服务中除了MSSQLserverADHelper以外所有的服务都打开了还是不行;名称正确、无别名、没起实例名称;端口号服务器端和客户端都是1433。为了找出问题只好上网查查结果发现连上网线后这个毛病就没了。晕,看来是少打了什么补丁。

2.写循环

  首先需求是这样的我手里现在有两张表,rights和roles。

  表结构如下:

rights
  -------------------
  rightid int
  right varchar(20)
  
  ==========
  
  roles
  -------------------
  roleid int
  roletype int
  role varchar(20)
  rightid int

    在我的role表里有一个角色admin。admin拥有right表中的所有权限,但是有四个字段,要是用手写完我这个速度,加上这个数量我看也就算了。省了手上的力气就要费脑子。

  在查询分析器里写了半天,总算是吭哧出来了。

  首先使用truncate table把role原来的失败信息清掉,听说会比delete快一点,只不过数量少看不出明显效果。

  然后建立一个临时的用于填充的存储过程。

create procedure TempFill
  
  declare mycursor cursor for
  select rightid from rights--这两个是一句,定义游标,然后从rights中取一个rightid给游标
  
  open mycursor
  
  declare @rightid int--定义一个变量
  fetch mycursor into @rightid--把mycursor当前的值给@rightid
  
  while @@fetch_status=
  begin
  insert into rolestable (roletype,role,rightid)values(,'admin',@rightid)
  fetch mycursor into @rightid
  end
  
  close mycursor
  deallocate mycursor

  这样就写完了。

  execute TempFill 再执行他一下。

(编辑:南京站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读