存储过程 游标 相关

来源:互联网 发布:淘宝怎么交易游戏账号 编辑:程序博客网 时间:2024/05/17 06:08
        今天写了一个存储过程,其中想用游标循环处理一些数据,而且需要参数。但是Server中没有带参数的游标(这个是从网上知道的,不代表个人看法,我总认为有的)。我说的带参数的游标是类似于带参数的存储过程或代码类一样,每次调用传参即可。但是游标没有这样的。倒是有一种近似的,就是先声明一个变量,如Declare @Id int ,可以在声明游标时这样用:select * from table where id=@Id 但是每次使用这个游标时,查询条件中的Id值是不变的,即游标中的任何参数总处于被声明时的状态,即便在存储过程中使用游标,游标的参数是传递给存储过程的参数。 好了,节省点废话,先看我写的存储过程吧,很简单,我要介绍的重点不在我的存储过程,而是游标带参数的应用。在我的存储过程之后还有一部分网上的方法,可以越过我的存储过程直接看。


CREATE procedure [dbo].[UP_GetBillStatusByUserId]
(
@UserId int = 0, --用户Id
@BillType int =0--单据类型
)
AS
DECLARE @BillStatusList nvarchar(200)='' --返回拼接的状态串
DECLARE @DeptId int=0
DECLARE @BillStatus char(10)=''
 IF  not exists(select * from sys.syscursors where cursor_name='MyBillStatusCursor')
    BEGIN
     DECLARE MyBillStatusCursor CURSOR LOCAL FOR
     SELECT DeptId FROM T_UserDept WHERE UserId=@UserId
    End
----BillType=3
IF(@BillType=3)
BEGIN
     OPEN MyBillStatusCursor
     FETCH NEXT FROM MyBillStatusCursor INTO @DeptId
     WHILE(@@FETCH_STATUS =0)
          BEGIN
       SELECT @BillStatus=BillStatus FROM T_DOAPExamDept WHERE DeptId=@DeptId
    IF(@BillStatus IS NOT NULL AND LEN(@BillStatus)>0)
      BEGIN
    SET @BillStatusList=@BillStatusList+RTRIM(@BillStatus)+','
   END
          SELECT @BillStatus=MIN(RejectBillStatus) FROM T_DOAPExamDept WHERE RejectBillStatus>@BillStatus
    IF(@BillStatus IS NOT NULL AND LEN(@BillStatus)>0)
      BEGIN
    SET @BillStatusList=@BillStatusList+RTRIM(@BillStatus)+','
   END
          FETCH NEXT FROM MyBillStatusCursor INTO @DeptId
     END
  CLOSE MyBillStatusCursor
END
---BillType=4
ELSE IF(@BillType=4)
BEGIN
     OPEN MyBillStatusCursor
     FETCH NEXT FROM MyBillStatusCursor INTO @DeptId
     WHILE(@@FETCH_STATUS =0)
          BEGIN
       SELECT @BillStatus=BillStatus FROM T_DOAMExamDept WHERE DeptId=@DeptId
       IF(@BillStatus IS NOT NULL AND LEN(@BillStatus)>0)
      BEGIN
    SET @BillStatusList=@BillStatusList+RTRIM(@BillStatus)+','
   END
          SELECT @BillStatus=MIN(RejectBillStatus) FROM T_DOAMExamDept WHERE RejectBillStatus>@BillStatus
    IF(@BillStatus IS NOT NULL AND LEN(@BillStatus)>0)
      BEGIN
    SET @BillStatusList=@BillStatusList+RTRIM(@BillStatus)+','
   END
          FETCH NEXT FROM MyBillStatusCursor INTO @DeptId
     END
  CLOSE MyBillStatusCursor
END
SELECT @BillStatusList

相当拙劣吧,呵呵

========================================

这是网上一些解决方法,我直接copy的,

-------------------------------

-- 参考下面的例子
declare @stmt nvarchar(200), @param nvarchar(40);
set @stmt=N'declare c cursor global for select * from authors where state=@state';
set @param=N'@state char(2)';
exec sp_executesql @stmt,@param,'CA';
open c;
fetch next from c;
close c;
deallocate c;

-----------------------------------------

exec('
    declare curOne cursor global
     for' + @aSql);
       declare @str nvarchar(20);
    open curOne
    fetch  curOne into @str;
       while(@@fetch_status=0)
       begin
       ...
       fetch  curOne into @str;
       end;
       close curone;
       deallocate curone;
旁白:和上一个如此相似,不过上一个更有含金量

--------------------------------------

CREATE   TABLE   #tabTmp(id   int) 
  INSERT   #tabTmp   EXECUTE('SELECT   id   FROM   '+@TableName)     
  declare   curOne   cursor   for   
  SELECT   id   FROM   #tabTmp 
  open   curOne 
  FETCH   NEXT   from   curOne   into     @ID
画外音:这个用到了临时表

-----------------------------------------------

END

去喝口茶吧。

原创粉丝点击