游标变量用法经典

BEGIN
SET NOCOUNT ON;
if @_MODE NOT IN (‘A’,’M’,’D’)
begin
  raiserror(‘参数错误!’,16,3);
  return;
end;

澳门金沙vip 1—生成测量检验表T
澳门金沙vip 2if exists(select 1 from sysobjects where Name=N’T’ and objectProperty(ID,N’IsUserTable’)=1)
澳门金沙vip 3    drop table T
澳门金沙vip 4go
澳门金沙vip 5select top 5 ID,Name into T from sysobjects
澳门金沙vip 6go
澳门金沙vip 7方法1:
澳门金沙vip 8
澳门金沙vip 9–创设输骑行标变量的仓库储存进度:
澳门金沙vip 10
澳门金沙vip 11create procedure P_cursor(
澳门金沙vip 12                            @Roy_Test cursor varying output
澳门金沙vip 13                        )
澳门金沙vip 14as
澳门金沙vip 15
澳门金沙vip 16set @Roy_Test=cursor global for
澳门金沙vip 17select 
澳门金沙vip 18    ID,Name
澳门金沙vip 19from 
澳门金沙vip 20    T
澳门金沙vip 21open @Roy_Test
澳门金沙vip 22if @@error<>0
澳门金沙vip 23    return 1
澳门金沙vip 24go
澳门金沙vip 25
澳门金沙vip 26–调用的蕴藏进度:
澳门金沙vip 27
澳门金沙vip 28create procedure  P_cursor2
澳门金沙vip 29as
澳门金沙vip 30declare @Roy_Test cursor,
澳门金沙vip 31        @ID int,@Name sysname
澳门金沙vip 32
澳门金沙vip 33exec P_cursor @Roy_Test=@Roy_Test output
澳门金沙vip 34
澳门金沙vip 35IF Cursor_Status(‘variable’, ‘@Roy_Test’) <= 0
澳门金沙vip 36    return 1
澳门金沙vip 37
澳门金沙vip 38fetch next from @Roy_Test into @ID,@Name
澳门金沙vip 39while @@fetch_status=0
澳门金沙vip 40    begin
澳门金沙vip 41        print ‘ID=’+rtrim(@ID)+’,Name=’+@Name
澳门金沙vip 42        fetch next from @Roy_Test into @ID,@Name
澳门金沙vip 43    end
澳门金沙vip 44close @Roy_Test
澳门金沙vip 45deallocate @Roy_Test
澳门金沙vip 46go
澳门金沙vip 47
澳门金沙vip 48
澳门金沙vip 49exec P_cursor2        –查看结果
澳门金沙vip 50
澳门金沙vip 51澳门金沙vip 52/**//*
澳门金沙vip 53ID=1,Name=sysobjects
澳门金沙vip 54ID=2,Name=sysindexes
澳门金沙vip 55ID=3,Name=syscolumns
澳门金沙vip 56ID=4,Name=systypes
澳门金沙vip 57ID=6,Name=syscomments
澳门金沙vip 58
澳门金沙vip 59*/
澳门金沙vip 60
澳门金沙vip 61go
澳门金沙vip 62create procedure P2_cursor(@Flag bit)
澳门金沙vip 63as
澳门金沙vip 64declare @roy_cursor cursor,
澳门金沙vip 65        @ID int,@Name sysname
澳门金沙vip 66if @Flag=0
澳门金沙vip 67    set @roy_cursor=Roy_cursor
澳门金沙vip 68else
澳门金沙vip 69    return 1         –能够定义其它游标
澳门金沙vip 70open @roy_cursor
澳门金沙vip 71fetch @roy_cursor into @ID,@Name
澳门金沙vip 72while @@fetch_status=0
澳门金沙vip 73begin
澳门金沙vip 74    print ‘ID=’+rtrim(@ID)+’,Name=’+@Name
澳门金沙vip 75    fetch @roy_cursor into @ID,@Name
澳门金沙vip 76end
澳门金沙vip 77close @roy_cursor
澳门金沙vip 78if @Flag=0
澳门金沙vip 79    deallocate Roy_cursor
澳门金沙vip 80else
澳门金沙vip 81    return 1        —-能够定义别的游标
澳门金沙vip 82
澳门金沙vip 83go
澳门金沙vip 84create procedure P2_cursor2
澳门金沙vip 85as
澳门金沙vip 86exec (‘declare Roy_cursor cursor global for 
澳门金沙vip 87        select ID,Name from T’)
澳门金沙vip 88declare @error int
澳门金沙vip 89set @error=@@error
澳门金沙vip 90if @error=0
澳门金沙vip 91    exec P2_cursor @Flag=0
澳门金沙vip 92else
澳门金沙vip 93    return @error 
澳门金沙vip 94go
澳门金沙vip 95
澳门金沙vip 96exec P2_cursor2        –查看结果
澳门金沙vip 97
澳门金沙vip 98澳门金沙vip 99/**//*
澳门金沙vip 100ID=1,Name=sysobjects
澳门金沙vip 101ID=2,Name=sysindexes
澳门金沙vip 102ID=3,Name=syscolumns
澳门金沙vip 103ID=4,Name=systypes
澳门金沙vip 104ID=6,Name=syscomments
澳门金沙vip 105
澳门金沙vip 106*/
澳门金沙vip 107
澳门金沙vip 108
澳门金沙vip 109删去测量检验:
澳门金沙vip 110–drop table T
澳门金沙vip 111–drop proc P_cursor,P_cursor2,P2_cursor,P2_cursor2
澳门金沙vip 112

–測試

declare @rowcount int,@error int;

 

 

澳门金沙vip,if @_MODE=’A’
begin
  insert into szdxInfo (Id,Bh,[Name],nation) select
    @Id,@Bh,@Name,
    @Nation;
  if @@error<>0 return;
end;

 

if @_MODE=’M’
begin
  update szdxInfo set [Name]=@Name,
    nation=@Nation
    where id=@id;
  select @error=@@error,@rowcount=@@rowcount;
  if @error<>0 return;
  if @rowcount<>1
    begin
      raiserror(‘未有改换记录!!’,16,3)
      return;
    end;
end;

create table ta ( 项目 varchar ( 20), 上级项目 varchar ( 20), num int
)

if @_MODE=’D’
begin
  delete szdxInfo where Id=@id;
  select
@error=@@error,@rowcount=@@rowcount
;
  if @error<>0 return;
  if @rowcount<>1
    begin
    raiserror(‘未有删除记录!!’,16,3)
    return;
  end;
end;

insert ta

insert into ActionLog ([date],[userid],Computerid,
  TableName,[Action]) select
    getdate(),@_USERID,
    @_COMPUTERID,
    ’szdxInfo’,@_MODE;

select ‘A’ , ” , 100 union
all

/*
exec Update_szdxInfo @id=’11’,
@Name =’刘某某’,
@Nation =’汉族’,
@_MODE =’A’,
@_USERID=1,
@_COMPUTERID=1
select * from szdxINfo
*/
END

select ‘B’ , ‘A’ , 200 union
all

select ‘C’ , ‘B’ , 300 union
all

select ‘D’ , ‘B’ , 400 union
all

select ‘E’ , ‘C’ , 500 union
all

select ‘F’ , ‘D’ , 600 union
all

select ‘H’ , ‘E’ , 700 union
all

select ‘G’ , ‘F’ , 800

 

— 假如要展现上面的品类 :

 

 

 

create function roy_f( @ 项目 varchar ( 20))

returns varchar ( 100)

as

begin

 

declare @ 上级项目 varchar ( 20)

 

select @ 上级体系 = 上级类别 from ta
where 项目 = @ 项目

 

return case when @ 上级项目 is null then
null

 

            else   isnull ( dbo.
roy_f( @ 上级项目 )+ ‘-‘ , ” )+ @ 项目 end

end

 

 

 

 

— 假诺展现各级项指标汇集金额 :

 

 

create function roy_f2( @ 项目 varchar ( 20))

returns int