Sql存储过程游标循环的用法及sql如何使用cursor写一个简单的循环
以下的 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 再执行他一下。 (编辑:南京站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |