DECLARE nextcorder CURSOR FOR 
……
OPEN nextcorder 
FETCH NEXT FROM nextcorder INTO
……
WHILE @@FETCH_STATUS = 0 
BEGIN
--从游标中读出变量,更新其它表
UPDATE ………………
END
CLOSE nextcorder 
DEALLOCATE nextCorder如上所述,BEGIN END块中的语句执行之后没有任何效果,但把它们直接在查询分析器中执行确有效,
这是怎么回事,该如何解决呢?谢谢!

解决方案 »

  1.   

    DECLARE @fileId INT 
    DECLARE @fileSId INT
    DECLARE @perSId INT
    DECLARE @repPerSId INT
    DECLARE @fileOrde INT
    DECLARE @execType nvarchar(10)
    DECLARE @perStatus nvarchar(10)
    DECLARE @signIdea nvarchar(50) 
    DECLARE nextcorder CURSOR FOR 
    --定义游标,获取当前数据表中,所有离职、休假人员未签批的文件信息,设置成‘等待’状态的除外
    SELECT T_OAfileList.F_fileId, T_OAfileList.F_fileSid, T_OAfileList.F_toPerSid, T_OAfileList.F_tacheorder, 
          VI_OAfileExecType.F_type AS F_perStatus, VI_OAfileExecType.F_execType, VI_OAfileExecType.F_repPerSid AS F_repPerSId
    FROM T_OAfileList INNER JOIN
          VI_OAfileExecType ON 
          VI_OAfileExecType.F_perSid = T_OAfileList.F_toPerSid 
    WHERE (T_OAfileList.F_tacheStatus = '到达') AND VI_OAfileExecType.F_type IN ('休假', '离职')
    AND VI_OAfileExecType.F_execType <> 'wait'OPEN nextcorder 
    FETCH NEXT FROM nextcorder
    INTO @fileId, @fileSId, @perSId, @fileOrde, @perStatus, @execType, @repPerSId
    WHILE @@FETCH_STATUS = 0 
    BEGIN
    --存在离休假的设置
    SET @signIdea = CASE @perStatus WHEN '休假' THEN '休假中……' WHEN '离职' THEN '已离职' END 
    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
    ELSE
    BEGIN 
    IF @execType = 'autoSign' 
    BEGIN
        UPDATE T_OAFileList SET F_tacheStatus = '已阅', F_signDate = GETDATE(), F_signIdea = @signIdea +' 自动签批' 
    WHERE F_fileSId = @fileSId 

    END
    END
    FETCH NEXT FROM nextcorder
    INTO @fileId, @fileSId, @perSId, @fileOrde, @perStatus, @execType, @repPerSId
    ENDCLOSE nextcorder 
    DEALLOCATE nextCorder写的比较乱的,请大家帮忙看看
      

  2.   

    现在的问题是,打开游标,依次取出数据,执行到
    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执行了都没效果,但如果将它们拷到查询分析器中,并给变量赋同样的值,直接运行却有效
      

  3.   

    IF @execType = 'signByOther'
       UPDATE T_OAFileList 
       SET F_tacheStatus = '已阅', F_signDate = GETDATE(), F_signIdea = @signIdea + ' 由代签人签批' 
       WHERE F_fileSId = @fileSId ----------
    update語句好像沒什麼問題,估計if出了問題? 
    你可以在if之前,加個print @execType看看...是不是有這個值
      

  4.   

    我在UPDATE之后,PRINT 'A',能办出A
      

  5.   

    所以,UPDATE应该是执行了的,可就失效一样,但同样赋值之后,在外面单独执行却能更新,是不是在游标中操作,还得再做其它的设置?
      

  6.   

    请楼主在IF @execType = 'signByOther'的语句块中print @fileSId,看看F_signIdea是否有@signIdea变量显示的这个值.更新既然没有错误,估计是更新的条件不满足.
      

  7.   

    还有个现象,就是在游标中执行UPDATE之后,没有返回影响了多少行的提示,只是提示“命令已成功完成”
      

  8.   

    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语句,却是有效的,难道是我数据库出问题了?
      

  9.   

    ......
    你加print debug下,把那些變量都print出來看看,是否滿足條件.
    語句應該沒問題吧
      

  10.   

    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)---長度不夠
      

  11.   

    谢谢楼上几位,DECLARE @execType nvarchar(10),变量的长度不够, 'signByOther'是11,可这样赋值怎么不报错?
      

  12.   

    DECLARE @execType nvarchar(10)
    SET  @execType = 'signByOther'
    print @execType
    -------------
    結果signByOthe
    所以讓你print一下,就可以看出錯誤了
      

  13.   

    怎么当时我在UPDATE 之后,PRINT 'a' ,却能输出a 呢?
      

  14.   

    可能是记错了吧,既然解决了就结贴,谢谢playwarcraft(三角褲叉叉的頂點)
      

  15.   

    既然IF @execType = 'signByOther'不满足,楼主是怎么print @fileSId的呢?还把@execType 恢复为10个长度,看看能不能print @fileSId.
      

  16.   

    --------------------------------------------------------------
    您好,我们是“2006中国杰出数据库工程师评选”活动组委会。
    您的帖子已经被我们转载到本次评选官方网站的“专家在线答疑”区。
    http://www.bestdba.cn/match_discussion.aspx在那里,进入本次评选复选的90位数据库工程师将与您展开积极的互动。
    一方面,他们会为您的问题提供满意的答案,
    另一方面,也邀请您为他们投上宝贵的选票。2006-7-8 ~ 2006-7-25日,每天我们将从当天参与"有奖投票"的网友
    中抽取3名幸运者,赠送由IBM提供的精美礼品一份!此外,您还可以在“专家在线答疑”区提出新的问题并参与讨论。您的帖子位于:
    http://www.bestdba.cn/match_discussion3.aspx?pointid=352&pointid2=1&pointid3=5&pcount=stc非常感谢您对本次活动的支持!
    --------------------------------------------------------------