Sql学习......
Sql学习
•1、 带游标的存储过程:
存储过程的定义规范,我们可以参照sql的联机帮助,可以详细的得到。
CREATE PROCEDURE copyData AS
declare @qid int,
@orgAddr varchar(25),
@destaddr varchar(25),
@answers varchar(256),
@receivedate datetime,
@serviceID varchar(10)
DECLARE MutiInsert_Cursor CURSOR FOR
select substring(DestAddr,14,17) as QID,OrgAddr,DestAddr,SM_Content,RecvTime,ServiceID from tbl_SMReceived
where Reserve2 is NULL
OPEN MutiInsert_Cursor
FETCH NEXT FROM MutiInsert_Cursor
into @qid,@orgAddr,@destaddr,@answers,@receivedate,@serviceID
WHILE @@FETCH_STATUS = 0
BEGIN
insert into tbl_Answers (QID,OrgAddr,DestAddr,Anwsers,ReceiveDate,ServiceID)
values(@qid,@orgAddr,@destaddr,',' @answers ',',@receivedate,@serviceID)
FETCH NEXT FROM MutiInsert_Cursor
into @qid,@orgAddr,@destaddr,@answers,@receivedate,@serviceID
END
CLOSE MutiInsert_Cursor
DEALLOCATE MutiInsert_Cursor
GO
上述存储过程用了游标,在使用存储过程时可能会出现查出多条记录插入一个表中的情况,当出现这种情况的时候sql会报错,错误大致意思就是不能同时插入处理多行。这个时候游标的作用就凸现出来啦。
游标顾名思义就像一个可以游动的指针,它指向结果的"一条"记录,这个一条很重要,这样就可以有了解决多行处理的方法。
定义方法:DECLARE MutiInsert_Cursor CURSOR FOR ........
For后的内容就是一张表,可以使select语句查询出来的表,也可以是其他。
在看后面的代码,你会发现,这跟asp读取数据库的recordset很相似,应该就是一个东西吧,游标嘛。
定义好游标后,先打开它,这时就可以读出它这个时候指向的记录内容。读取方法为:
FETCH NEXT FROM MutiInsert_Cursor
into @qid,@orgAddr,@destaddr,@answers,@receivedate,@serviceID
into后面的东西就是存储过程一开始定义的变量。
对于内容遍历,可以做一个循环(如下:):
WHILE @@FETCH_STATUS = 0
BEGIN
insert into tbl_Answers (QID,OrgAddr,DestAddr,Anwsers,ReceiveDate,ServiceID)
values(@qid,@orgAddr,@destaddr,',' @answers ',',@receivedate,@serviceID)
1/6 1 2 3 4 5 6 下一页 尾页 |