求助:FETCH NEXT失败,FETCH状态始终都是-1

greenhong 2015-07-09 11:48:13
USE [MyBPCS]
GO
/****** Object: UserDefinedFunction [dbo].[ItmAging] Script Date: 2015/7/9 11:47:15 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date, ,>
-- Description: <Description, ,>
-- =============================================
ALTER Function [dbo].[ItmAging](
@wPROD char(35),
@wFac char(3),
@wSCST decimal(15, 5),
@wQONH decimal(11, 3),
@gPD1 int,
@gPD2 int,
@gPD3 int,
@gPD4 int,
@gPD5 int)
returns @tmTable table(
tmQTY1 decimal(11, 3),
tmQTY2 decimal(11, 3),
tmQTY3 decimal(11, 3),
tmQTY4 decimal(11, 3),
tmQTY5 decimal(11, 3),
tmQTY6 decimal(11, 3))
as
begin
declare
@wStart decimal(11, 3),
@wQTY decimal(11, 3),
@wQTY1 decimal(11, 3),
@wQTY2 decimal(11, 3),
@wQTY3 decimal(11, 3),
@wQTY4 decimal(11, 3),
@wQTY5 decimal(11, 3),
@wQTY6 decimal(11, 3),
@wRow int,
@sSQL nvarchar(256)
set @wQTY=0
set @wQTY1=0
set @wQTY2=0
set @wQTY3=0
set @wQTY4=0
set @wQTY5=0
set @wQTY6=0
set @wStart=@wQONH

declare @tmith table(TTDTE decimal(8, 0),TQTY decimal(11, 3))
insert into @tmith
SELECT TTDTE,TQTY FROM MyBPCS.dbo.ITH LEFT OUTER JOIN MyBPCS.dbo.IWM ON LWHS=TWHS
WHERE TPROD='''+@wPROD+''' AND WMFAC='''+@wFac+''' AND TTYPE IN ('#','B','R','SR','U') AND TQTY>0
ORDER BY 1 DESC

declare tmCursor cursor local for select * from @tmith
open tmCursor
declare @csrsts smallint
set @csrsts=CURSOR_STATUS('local','tmCursor')
if @csrsts <=0
begin
set @wQTY6=@wQONH
end
else
begin
declare @wTQTY decimal(11, 3),@wTDTE decimal(8, 0)
fetch next from tmCursor into @wTDTE,@wTQTY
while @@FETCH_STATUS=0
begin
If @wTQTY>=@wStart
begin
set @wQTY=@wStart
end
Else
begin
set @wQTY=@wTQTY
end
set @wStart=@wStart-@wTQTY

declare @wDays int,@wDate date
set @wDate=cast(left(char(@wTDTE), 4)+'-'+substring(char(@wTDTE), 5, 2)+'-'+right(char(@wTDTE),2) as date)
set @wDays=datediff("d", @wDate, getdate())
if @wDays<=@gPD1 begin set @wQTY1=@wQTY1+@wQTY end
if @wDays between @gPD1+1 and @gPD2 begin set @wQTY2=@wQTY2+@wQTY end
if @wDays between @gPD2+1 and @gPD3 begin set @wQTY3=@wQTY3+@wQTY end
if @wDays between @gPD3+1 and @gPD4 begin set @wQTY4=@wQTY4+@wQTY end
if @wDays between @gPD4+1 and @gPD5 begin set @wQTY5=@wQTY5+@wQTY end
if @wDays>@gPD5 begin set @wQTY6=@wQTY6+@wQTY end
fetch next from tmCursor into @wTDTE,@wTQTY
end
end
close tmCursor
deallocate tmCursor

insert into @tmTable values(@wQTY1,@wQTY2,@wQTY3,@wQTY4,@wQTY5,@wQTY6)
return
end
...全文
495 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
greenhong 2015-07-16
  • 打赏
  • 举报
回复
结贴 u011015550 10分 ,Tiger_Zhao 30分 新人,分有点少,不成敬意 感谢两位同学的热情解答
Tiger_Zhao 2015-07-16
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 greenhong 的回复:]按照2楼的参数,单独运行
SELECT TTDTE,TQTY FROM MyBPCS.dbo.ITH LEFT OUTER JOIN MyBPCS.dbo.IWM ON LWHS=TWHS
WHERE TPROD='''+@wPROD+''' AND WMFAC='''+@wFac+''' AND TTYPE IN ('#','B','R','SR','U') AND TQTY>0
ORDER BY 1 DESC
其实是有一条记录的[/Quote]
既然是参数错写成了字符串,你这个怎么测试成功的???
greenhong 2015-07-16
  • 打赏
  • 举报
回复
成了,哇哈哈哈 在表值函数中的最终写法是这样的 declare @tmith table(TTDTE decimal(8, 0),TQTY decimal(11, 3)) insert into @tmith(TTDTE,TQTY) SELECT a.TTDTE,a.TQTY FROM dbo.ITH a LEFT OUTER JOIN dbo.IWM b ON b.LWHS=a.TWHS WHERE a.TPROD=''+@wPROD+'' AND b.WMFAC=''+@wFac+'' AND a.TTYPE IN ('#','B','R','SR','U') AND a.TQTY>0 ORDER BY 1 DESC
greenhong 2015-07-16
  • 打赏
  • 举报
回复
改成表变量也是可行的 declare @tmith table(TTDTE decimal(8, 0),TQTY decimal(11, 3)) set @ssql='insert into @tmith SELECT TTDTE,TQTY FROM dbo.ITH LEFT OUTER JOIN dbo.IWM ON LWHS=TWHS WHERE TPROD='''+@wPROD+''' AND WMFAC='''+@wFac+''' AND TTYPE IN (''#'',''B'',''R'',''SR'',''U'') AND TQTY>0 ORDER BY TTDTE' exec (@sSQL) 但是不能用于表值函数 提示EXEC不可用于函数内 存储过程PRINT @sSQL 结果是: insert into @tmith SELECT TTDTE,TQTY FROM dbo.ITH LEFT OUTER JOIN dbo.IWM ON LWHS=TWHS WHERE TPROD='000020-87210 ' AND WMFAC='SZ ' AND TTYPE IN ('#','B','R','SR','U') AND TQTY>0 ORDER BY TTDTE 函数中不知道怎么写才有这种效果
greenhong 2015-07-16
  • 打赏
  • 举报
回复
换了一种写法,终于有记录了 set @ssql='insert into dbo.tmith SELECT TTDTE,TQTY FROM dbo.ITH LEFT OUTER JOIN dbo.IWM ON LWHS=TWHS WHERE TPROD='''+@wPROD+''' AND WMFAC='''+@wFac+''' AND TTYPE IN (''#'',''B'',''R'',''SR'',''U'') AND TQTY>0 ORDER BY TTDTE' exec (@sSQL) 这个是在定义实表中测试的,一会再改回表变量试试
Tiger_Zhao 2015-07-16
  • 打赏
  • 举报
回复
你自己多做Debug检查吧。
你两表连接的查询,字段都不加表名前缀,谁知道字段是哪个表的。
greenhong 2015-07-16
  • 打赏
  • 举报
回复
将标值函数改成了存储过程, 将声明表变量改成了创建实表, 发现:真的没有记录 这是为什么呢?表字段属性和变量属性都一样
Tiger_Zhao 2015-07-15
  • 打赏
  • 举报
回复
[Quote=联机帮助]CURSOR_STATUS (Transact-SQL)
返回类型

返回值  游标名                                         游标变量  
------- ---------------------------------------------- --------------------------------------------------
1 游标的结果集至少有一行。 分配给该变量的游标已打开。
对于不区分的游标和键集游标,结果集至少有一行。 对于不区分的游标和键集游标,结果集至少有一行。
对于动态游标,结果集可以有零行、一行或多行。 对于动态游标,结果集可以有零行、一行或多行。
0 游标的结果集为空。* 分配给该变量的游标已经打开,然而结果集肯定为空。*
...

* 动态游标从不返回此结果。[/Quote]
不加任何修饰的游标默认就是动态游标。
所以原因很简单,@tmith表中没记录啊!!!
Tiger_Zhao 2015-07-15
  • 打赏
  • 举报
回复
SELECT COUNT(*) FROM @tmith

直接可以验证记录数的。
检查下参数、@tmith表的字段和原表字段类型是否一致。尤其是char和varchar进行比较。

greenhong 2015-07-15
  • 打赏
  • 举报
回复
谢谢Tiger Zhao 按照2楼的参数,单独运行 SELECT TTDTE,TQTY FROM MyBPCS.dbo.ITH LEFT OUTER JOIN MyBPCS.dbo.IWM ON LWHS=TWHS WHERE TPROD='''+@wPROD+''' AND WMFAC='''+@wFac+''' AND TTYPE IN ('#','B','R','SR','U') AND TQTY>0 ORDER BY 1 DESC 其实是有一条记录的 不知道为什么到函数中就没有了记录 还是不知道到底哪些错了
greenhong 2015-07-14
  • 打赏
  • 举报
回复
还没找到原因 继续顶
greenhong 2015-07-09
  • 打赏
  • 举报
回复
对了,使用这条语句来Debug的 select * from dbo.ItmAging('000020-87210 ','SZ',1.83396,900.000,30,60,90,180,365) 大意是:获取某个物料的仓存账龄
greenhong 2015-07-09
  • 打赏
  • 举报
回复
第一次写表值函数,见笑 Debug到Cursor-Status时,值为1 单独运行SELECT时,也确实有一条记录 运行到FETCH NEXT时,FETCH-Status为-1 郁闷啊 大神们看看是哪里写错了
greenhong 2015-07-09
  • 打赏
  • 举报
回复
自己顶一下 第一次用游标
greenhong 2015-07-09
  • 打赏
  • 举报
回复
谢谢楼上同学的热情解答 试了(1),显示不可以,下面有红色波浪线 然后试着将接受变量改成和表字段同名,没有显示错误,Debug到Fetch-Status时,仍然是-1 declare @tmith table(TTDTE decimal(8, 0),TQTY decimal(11, 3)) insert into @tmith SELECT TTDTE,TQTY FROM MyBPCS.dbo.ITH LEFT OUTER JOIN MyBPCS.dbo.IWM ON LWHS=TWHS WHERE TPROD='''+@wPROD+''' AND WMFAC='''+@wFac+''' AND TTYPE IN ('#','B','R','SR','U') AND TQTY>0 ORDER BY 1 DESC declare tmCursor cursor local for select TTDTE,TQTY from @tmith open tmCursor declare @csrsts smallint set @csrsts=CURSOR_STATUS('local','tmCursor') if @csrsts <=0 begin set @wQTY6=@wQONH end else begin declare @TQTY decimal(11, 3),@TTDTE decimal(8, 0) fetch next from tmCursor into @TTDTE,@TQTY while @@FETCH_STATUS=0
Neo_whl 2015-07-09
  • 打赏
  • 举报
回复

--两处参考意见:
(1)
declare tmCursor cursor local for select * from @tmith  --*换成@wTDTE,@wTQTY 变量对应的具体字段

(2)
   set @wDays=datediff(“d”, @wDate, getdate())  --“d”改为d ,你的估计是2012以上版本,没有特殊设置一般不支持""号


34,588

社区成员

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

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