游标中不能直接执行更新操作?

xjjdanran 2006-07-21 09:41:42
DECLARE nextcorder CURSOR FOR
……
OPEN nextcorder
FETCH NEXT FROM nextcorder INTO
……
WHILE @@FETCH_STATUS = 0
BEGIN
--从游标中读出变量,更新其它表
UPDATE ………………
END
CLOSE nextcorder
DEALLOCATE nextCorder

如上所述,BEGIN END块中的语句执行之后没有任何效果,但把它们直接在查询分析器中执行确有效,
这是怎么回事,该如何解决呢?谢谢!
...全文
355 25 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
hellowork 2006-07-21
  • 打赏
  • 举报
回复
既然IF @execType = 'signByOther'不满足,楼主是怎么print @fileSId的呢?还把@execType 恢复为10个长度,看看能不能print @fileSId.
xjjdanran 2006-07-21
  • 打赏
  • 举报
回复
可能是记错了吧,既然解决了就结贴,谢谢playwarcraft(三角褲叉叉的頂點)
xjjdanran 2006-07-21
  • 打赏
  • 举报
回复
怎么当时我在UPDATE 之后,PRINT 'a' ,却能输出a 呢?
playwarcraft 2006-07-21
  • 打赏
  • 举报
回复
會自動截斷啊~~
playwarcraft 2006-07-21
  • 打赏
  • 举报
回复
DECLARE @execType nvarchar(10)
SET @execType = 'signByOther'
print @execType
-------------
結果signByOthe
所以讓你print一下,就可以看出錯誤了
xjjdanran 2006-07-21
  • 打赏
  • 举报
回复
谢谢楼上几位,DECLARE @execType nvarchar(10),变量的长度不够, 'signByOther'是11,可这样赋值怎么不报错?
playwarcraft 2006-07-21
  • 打赏
  • 举报
回复
DECLARE @execType nvarchar(10)
SET @execType = 'signByOther'
IF @execType = 'signByOther'
UPDATE T_OAFileList SET F_tacheStatus = '已阅', F_signDate = GETDATE(), F_signIdea = ' 由代签人签批'
WHERE F_fileSId = 259

----------
nvarchar(10)---長度不夠
xjjdanran 2006-07-21
  • 打赏
  • 举报
回复
我明白了,应该是变量的范围不够,但怎么也不报错呢?
playwarcraft 2006-07-21
  • 打赏
  • 举报
回复
......
你加print debug下,把那些變量都print出來看看,是否滿足條件.
語句應該沒問題吧
xjjdanran 2006-07-21
  • 打赏
  • 举报
回复
hellowork(一两清风)
条件是满足的,刚刚做局部的调试又发现一个比较奇怪的现象:

DECLARE @execType nvarchar(10)
SET @execType = 'signByOther'
IF @execType = 'signByOther'
UPDATE T_OAFileList SET F_tacheStatus = '已阅', F_signDate = GETDATE(), F_signIdea = ' 由代签人签批'
WHERE F_fileSId = 259

执行上述代码,还是只是提示“命令已成功完成”,但更新无新;但直接运行UPDATE语句,却是有效的,难道是我数据库出问题了?
xjjdanran 2006-07-21
  • 打赏
  • 举报
回复
还有个现象,就是在游标中执行UPDATE之后,没有返回影响了多少行的提示,只是提示“命令已成功完成”
hellowork 2006-07-21
  • 打赏
  • 举报
回复
请楼主在IF @execType = 'signByOther'的语句块中print @fileSId,看看F_signIdea是否有@signIdea变量显示的这个值.更新既然没有错误,估计是更新的条件不满足.
xjjdanran 2006-07-21
  • 打赏
  • 举报
回复
所以,UPDATE应该是执行了的,可就失效一样,但同样赋值之后,在外面单独执行却能更新,是不是在游标中操作,还得再做其它的设置?
xjjdanran 2006-07-21
  • 打赏
  • 举报
回复
我在UPDATE之后,PRINT 'A',能办出A
playwarcraft 2006-07-21
  • 打赏
  • 举报
回复
IF @execType = 'signByOther'
UPDATE T_OAFileList
SET F_tacheStatus = '已阅', F_signDate = GETDATE(), F_signIdea = @signIdea + ' 由代签人签批'
WHERE F_fileSId = @fileSId

----------
update語句好像沒什麼問題,估計if出了問題?
你可以在if之前,加個print @execType看看...是不是有這個值
xjjdanran 2006-07-21
  • 打赏
  • 举报
回复
郁闷…………
xjjdanran 2006-07-21
  • 打赏
  • 举报
回复
可执行之后,达不到预期的效果啊
playwarcraft 2006-07-21
  • 打赏
  • 举报
回复
看看語句好像沒什麼問題嘛
xjjdanran 2006-07-21
  • 打赏
  • 举报
回复
现在的问题是,打开游标,依次取出数据,执行到
IF @execType = 'signByOther'
BEGIN
UPDATE T_OAFileList SET F_tacheStatus = '已阅', F_signDate = GETDATE(), F_signIdea = @signIdea + ' 由代签人签批'
WHERE F_fileSId = @fileSId
INSERT INTO T_OAFileList (F_fileId, F_toPerSid, F_tacheOrder, F_tacheType, F_tacheStatus, F_arriveDate)
SELECT F_fileId, @repPerSId, F_tacheOrder, F_tacheType, '到达', GETDATE()
FROM T_OAfileList
WHERE F_fileSId = @fileSId
END

里面的UPDATE 和INSERT执行了都没效果,但如果将它们拷到查询分析器中,并给变量赋同样的值,直接运行却有效
playwarcraft 2006-07-21
  • 打赏
  • 举报
回复
update語句帖出來看看
加载更多回复(5)

34,838

社区成员

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

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