日期:2014-05-19  浏览次数:20873 次

求救,存储过程顺利执行,但是里面的update未生效
CREATE   PROCEDURE     ECS_MIS_PREPARE_REQ(@batchId   INTEGER,@retcode   VARCHAR(6)   OUTPUT)
AS
BEGIN

DECLARE   @nowDate   VARCHAR(8)
SET   @nowDate   =   convert(varchar(8),getDate(),112)


IF   NOT   EXISTS(SELECT   *   FROM   ECS_MIS_BATCHFLAG   WHERE   BATCH_CONTENT   =   'CUSTCOM '   AND   batch_date   =   @nowDate)  
BEGIN
BEGIN   TRANSACTION
INSERT   INTO   ECS_MIS_BATCHFLAG(batch_content,   batch_date,batch_flag,   batch_remark)VALUES( 'CUSTCOM ',@nowDate,NULL,NULL)
COMMIT   TRANSACTION
END

BEGIN   TRANSACTION
DELETE   FROM   ECS_MIS_CUSTCOM_REQ
COMMIT   TRANSACTION

BEGIN   TRANSACTION
INSERT   INTO   ECS_MIS_CUSTCOM_REQ   (seq_no,   cust_name,   cert_no,   birthday)   SELECT   taskId,   customerName,   credentialCode,   birthday   FROM   TsmTask   WHERE   batchId   =   @batchId  
COMMIT   TRANSACTION

BEGIN   TRANSACTION
UPDATE   ECS_MIS_BATCHFLAG   SET   batch_flag= '0 '   WHERE   batch_content= 'CUSTCOMM '   AND   batch_date=@nowDate
COMMIT   TRANSACTION


IF   @@ERROR   <>   0  
      --   返回错误代码
      SET   @retcode   =   '005002 '
ELSE
      --   返回成功代码
      SET   @retcode   =   '005000 '

END
--------------------------

执行完毕后,数据插入了表,但是batch_flag却还是为null,我在存储过程里写了更新为0的啊
为什么不生效呢?

------解决方案--------------------
把你的表结构和一部分数据写出来,你的存储过程存在很大的问题,这样写事务没有什么作用。
------解决方案--------------------
哈哈,第一次见人这样写事务,太经典了

这样的事务写和不写唯一的区别就是,写了占系统资源。

=====================================================
正确写法:
declare @error int
set @error = 0
BEGIN TRANSACTION
UPDATE ECS_MIS_BATCHFLAG SET batch_flag= '0 ' WHERE batch_content= 'CUSTCOMM ' AND batch_date=@nowDate
set @error = @@error
if @@error = 0
begin
COMMIT TRANSACTION
else
rollback transaction
--select ... 返回错误信息
return
end

------解决方案--------------------
lz怎么写了这么多的事务啊!是故意要让他们分开执行的么?而且怎么只有提交没有回滚啊!最好说出你要实现的功能。