受不了了,找了半天没找到问题.高手进来看看,应该超简单.

lihongdian 2008-12-10 04:33:43
BEGIN
create table #tmp_fd(id int identity(1,1),f int,d int)
OPEN MON_QCUM
WHILE @@FETCH_STATUS = 0
BEGIN
FETCH NEXT FROM MON_QCUM INTO @Months,@Qcum
insert into #tmp_fd(f,d) values(@Months,@Qcum)
END
CLOSE MON_QCUM
DEALLOCATE MON_QCUM
select * from #tmp_fd
END

这个存储过程,把我一个游标查出来的值,插入临时表中.但是结果却总是多出一行.不知道是为什么.
id f d
1 2 2
2 3 3 这两行
3 3 3 这两行值一样

最后两行重复,多出一行.
高手救命!!
...全文
98 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
快乐_石头 2008-12-10
  • 打赏
  • 举报
回复
SQL游标的使用
一、游标包括两个部分:
1、游标结果集 由定义该游标的select语句返回的行的集合
2、游标位置 指向这个集合中某行的指针

二、游标处理过程:
使用declare 语句声明
使用open语句打开
使用fecth语句从游标中提取数据
判断是否为空,为空no则返回上一步,不为空yes
使用close关闭
使用deallocate释放

1、声明游标:
declare 游标名 [insensitive] [scroll] cursor for select语句 [for {read only | update [of 列[,....n]]}]
说明: insensitive 定义一个游标,以创建将由该游标使用的数据的临时复本。
scroll指定所有的提取项(first,last,prior,next,relative,absolute)均可用,默认为next
在select语句中不允许用compute,compute by ,for browse和into

2、打开游标:
open {{[globa] 游标名} | 游标变量
说明:global 为全局游标

3、从打开的游标中提取行

三、游标类型
Const adOpenForwardOnly = 0
前向游标,为缺省游标,提供最快的运行性能。用它打开recordset,从对至尾顺序取得所有结果。它不支持向后滚动,只允许在结果间单向移动。

Const adOpenKeyset = 1
静态游标,反映第一次打开游标时表中数据的状态,游标无法查明底层表中的数据行是否更新过、删除过或添加了新的数据。不过与只能前移的洲标不同,静态游标可以在结果间前后滚动。

Const adOpenDynamic = 2
键盘驱动的游标,可以查询表中底层数据行的某些变化,但不是全部。它特别是可以准确反映数据是否更新过。但它不能查明其它用户是否曾删除过数据行(删除掉的数据行在recordset中会留下空洞)。键盘驱动的游标支持在结果间前后滚动。

Const adOpenStatic = 3
动态游标,是最丰富的游标类型。游标打开时可以查询其他用户对表的任何改动,而且支持滚动。



加锁类型
Const adLockReadOnly = 1
缺省的上锁类型,只读方式上锁允许多个用户同时读取同样的数据,但不能改变数据。

Const adLockPessimistic = 2
以悲观上锁方式打开数据对象。该方式假定在你编辑记录时会有其它用户访问数据。此时一旦你开始编辑记录,其它用户就不能访问该数据。

Const adLockOptimistic = 3
以乐观上锁方式打开数据对象。该方式假定在你编辑记录时不会有其它用户访问数据。在完成改变之前,其它用户不能访问该记录。

Const adLockBatchOptimistic = 4
执行多行批处理更新时使用这种类型

六、综合实例
用sql server游标语句打印报表
DECLARE authors_cursor CURSOR FOR
SELECT au_id, au_fname, au_lname
FROM authors
WHERE state = "UT"
ORDER BY au_id

OPEN authors_cursor

FETCH NEXT FROM authors_cursor
INTO @au_id, @au_fname, @au_lname

WHILE @@FETCH_STATUS = 0
BEGIN
PRINT " "
SELECT @message = "----- Books by Author: " +
@au_fname + " " + @au_lname

PRINT @message

-- Declare an inner cursor based
-- on au_id from the outer cursor.

DECLARE titles_cursor CURSOR FOR
SELECT t.title
FROM titleauthor ta, titles t
WHERE ta.title_id = t.title_id AND
ta.au_id = @au_id -- Variable value from the outer cursor

OPEN titles_cursor
FETCH NEXT FROM titles_cursor INTO @title

IF @@FETCH_STATUS <> 0
PRINT " <<No Books>>"

WHILE @@FETCH_STATUS = 0
BEGIN

SELECT @message = " " + @title
PRINT @message
FETCH NEXT FROM titles_cursor INTO @title

END

CLOSE titles_cursor
DEALLOCATE titles_cursor

-- Get the next author.
FETCH NEXT FROM authors_cursor
INTO @au_id, @au_fname, @au_lname
END

CLOSE authors_cursor
DEALLOCATE authors_cursor
GO
dawugui 2008-12-10
  • 打赏
  • 举报
回复
BEGIN
create table #tmp_fd(id int identity(1,1),f int,d int)
OPEN MON_QCUM
WHILE @@FETCH_STATUS = 0
BEGIN
insert into #tmp_fd(f,d) values(@Months,@Qcum)
FETCH NEXT FROM MON_QCUM INTO @Months,@Qcum
END
CLOSE MON_QCUM
DEALLOCATE MON_QCUM
select * from #tmp_fd
END
林虎 2008-12-10
  • 打赏
  • 举报
回复
FETCH NEXT FROM MON_QCUM INTO @Months,@Qcum
WHILE @@FETCH_STATUS = 0
BEGIN

insert into #tmp_fd(f,d) values(@Months,@Qcum)
FETCH NEXT FROM MON_QCUM INTO @Months,@Qcum
END
dawugui 2008-12-10
  • 打赏
  • 举报
回复
你的那些@Months,@Qcum的参数在哪里?
-狙击手- 2008-12-10
  • 打赏
  • 举报
回复
BEGIN
create table #tmp_fd(id int identity(1,1),f int,d int)
OPEN MON_QCUM
FETCH NEXT FROM MON_QCUM INTO @Months,@Qcum
WHILE @@FETCH_STATUS = 0
BEGIN

insert into #tmp_fd(f,d) values(@Months,@Qcum)
FETCH NEXT FROM MON_QCUM INTO @Months,@Qcum
END
CLOSE MON_QCUM
DEALLOCATE MON_QCUM
select * from #tmp_fd
END

34,593

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧