第一次使用mssql游标

第一次使用游标

简单的操作

 1 /* 测试用表*/
 2 if(OBJECT_ID('ta') is not null)
 3 drop table ta
 4 CREATE TABLE [dbo].[ta](
 5     [id] [nchar](100) NULL,
 6     [a] [nchar](100) NULL,
 7     [b] [nchar](100) NULL
 8 )
 9 
10 insert into ta values(1,'aa1','ab1')
11 insert into ta values(2,'aa2','ab2')
12 insert into ta values(3,'aa3','ab3')
13 /* 测试用表*/
14 if(OBJECT_ID('tb') is not null)
15 drop table tb
16 CREATE TABLE [dbo].[tb](
17     [id] [nchar](100) NULL,
18     [a] [nchar](100) NULL,
19     [b] [nchar](100) NULL
20 )
21 
22 insert into tb values(1,'ba1','bb1')
23 insert into tb values(2,'ba2','bb2')
24 insert into tb values(3,'ba3','bb3')
25 /* 测试用表*/
26 if(OBJECT_ID('tc') is not null)
27 drop table tc
28 CREATE TABLE [dbo].[tc](
29     [id] [nchar](100) NULL,
30     [a] [nchar](100) NULL,
31     [b] [nchar](100) NULL
32 )
33 
34 insert into tc values(1,'ca1','cb1')
35 insert into tc values(2,'ca2','cb2')
36 insert into tc values(3,'ca3','cb3')
37 
38 
39 if(OBJECT_ID('proc_test') is not null)
40 drop procedure proc_test
41 
42 go
43 
44 /* 创建存储过程*/
45 create procedure proc_test
46 as 
47 /* 创建第一个游标*/
48 declare cur_test cursor local read_only 
49 for  
50 select * from ta 
51 /* 打开游标*/
52 open cur_test;
53 
54 declare @ID nvarchar(20);
55 declare @a nvarchar(20);
56 declare @b nvarchar(20);
57 
58 /* 读取游标*/
59 fetch next from cur_test into @id,@a,@b
60 /* 遍历游标*/
61 while(@@FETCH_STATUS =0)
62 begin
63         /* 嵌套创建游标*/
64         declare cur_test2 cursor local read_only 
65         for select * from tb
66         open cur_test2;
67         declare @bID nvarchar(20);
68         declare @ba nvarchar(20);
69         declare @bb nvarchar(20);
70         
71         fetch next from cur_test2 into  @bid,@ba,@bb
72         while(@@FETCH_STATUS =0)
73         begin
74         /* 更新操作*/
75         update tc set a=@a+@ba, b=@b+@bb where id=@bid
76         fetch next from cur_test2 into  @bid,@ba,@bb
77         end
78         close cur_test2;
79         deallocate  cur_test2;
80          
81 fetch next from cur_test into  @id,@a,@b
82 end
83  
84 close cur_test;
85 deallocate  cur_test;
86 
87 /* 执行*/
88 exec proc_test

性能不好,寻找代替方法。

原文地址:https://www.cnblogs.com/x4646/p/2939771.html