首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

求帮忙解决存储过程有关问题

2013-06-19 
求帮忙解决存储过程问题我在 sql server 2005 数据库中建了这样一个存储过程createPROCEDURE [dbo].[pro_a

求帮忙解决存储过程问题
我在 sql server 2005 数据库中建了这样一个存储过程

create  PROCEDURE [dbo].[pro_a] @AS_IN VARCHAR(200), @AS_OUT VARCHAR(200) OUT,  @AI_DO INT OUT
AS
BEGIN
DECLARE @CARDIDVARCHAR(8)     
DECLARE @AMOUNTDECIMAL(10,2)  
DECLARE @BUSNUMVARCHAR(12)    
DECLARE @DBNUMVARCHAR(12)   
DECLARE @BDATEVARCHAR(14)    
DECLARE @BDATEAVARCHAR(20)    
DECLARE@LS_VALVARCHAR(10)
    declare @aa    varchar(10)

IF LEN(@AS_IN) >66
BEGIN 
SET @LS_VAL = SUBSTRING(@AS_IN,5,2)
SET @CARDID = SUBSTRING(@AS_IN,12,8)
SET @BUSNUM = SUBSTRING(@AS_IN,42,12)
SET @DBNUM = SUBSTRING(@AS_IN,54,12)
SET @BDATE = SUBSTRING(@AS_IN,20,14)
IF @LS_VAL <> 'XV'
BEGIN
SET @AS_OUT = '写入失败'
RETURN 0
END
    SET @AMOUNT = CONVERT(DECIMAL(10,2),CAST(SUBSTRING(@AS_IN,34,8) AS FLOAT)/100)
SET @BDATEA = LEFT(@BDATE,4)+'-'+SUBSTRING(@BDATE,5,2)+'-'+SUBSTRING(@BDATE,7,2)+' '+ SUBSTRING(@BDATE,9,2)+':'+SUBSTRING(@BDATE,11,2)+':'+SUBSTRING(@BDATE,13,2)
BEGIN TRANSACTION
    INSERT INTO DBO.table1(CARDID,AMOUNT,BUSNUM,BDATE,DBNUM) VALUES (@CARDID,@AMOUNT,@BUSNUM,@BDATEA,@DBNUM)
IF @@ERROR = 0
BEGIN
COMMIT TRANSACTION
SET @AS_OUT = '写入成功'
RETURN 0
END
ELSE 
BEGIN
ROLLBACK TRANSACTION
SET @AS_OUT = '写入失败'
RETURN 0
END
END
ELSE 
BEGIN
SET @AS_OUT = '写入失败'
RETURN 0
END
 END
GO

我通过程序调用这个存储过程,获得存储过程返回值‘写入成功’,但是我在数据库table1表里面却找不到这条数据,然后在数据库里面用同样的条件执行存储过程,存储过程返回值是‘写入成功’,数据库表里面也会有这个数据。并且通过程序调用存储过程,也不是所有的数据都不能写入数据表,只是部分有数据有这样的问题。请问这个是什么原因啊,该怎样解决? 在这里先谢谢了 , 都纠结一下午了 。。。。。。
[解决办法]

create  PROCEDURE [dbo].[pro_a] @AS_IN VARCHAR(200), @AS_OUT VARCHAR(200) OUT,  @AI_DO INT OUT
 AS
 BEGIN
 DECLARE @CARDID VARCHAR(8)     
 DECLARE @AMOUNT DECIMAL(10,2)  
 DECLARE @BUSNUM VARCHAR(12)    
 DECLARE @DBNUM VARCHAR(12)   
 DECLARE @BDATE VARCHAR(14)    
 DECLARE @BDATEA VARCHAR(20)    
 DECLARE @LS_VAL VARCHAR(10)
     declare @aa    varchar(10)
 
IF LEN(@AS_IN) >66
 BEGIN 
 SET @LS_VAL = SUBSTRING(@AS_IN,5,2)
 SET @CARDID = SUBSTRING(@AS_IN,12,8)
 SET @BUSNUM = SUBSTRING(@AS_IN,42,12)
 SET @DBNUM = SUBSTRING(@AS_IN,54,12)


 SET @BDATE = SUBSTRING(@AS_IN,20,14)
 IF @LS_VAL <> 'XV'
 BEGIN
 SET @AS_OUT = '写入失败'
RETURN 0
 END
      SET @AMOUNT = CONVERT(DECIMAL(10,2),CAST(SUBSTRING(@AS_IN,34,8) AS FLOAT)/100)
 SET @BDATEA = LEFT(@BDATE,4)+'-'+SUBSTRING(@BDATE,5,2)+'-'+SUBSTRING(@BDATE,7,2)+' '+ SUBSTRING(@BDATE,9,2)+':'+SUBSTRING(@BDATE,11,2)+':'+SUBSTRING(@BDATE,13,2)
 BEGIN TRANSACTION
     INSERT INTO DBO.table1(CARDID,AMOUNT,BUSNUM,BDATE,DBNUM) VALUES (@CARDID,@AMOUNT,@BUSNUM,@BDATEA,@DBNUM) 
IF @@ERROR = 0 
BEGIN
 SET @AS_OUT = '写入成功'
 COMMIT TRANSACTION

RETURN 0
 END
 ELSE 
 BEGIN
  SET @AS_OUT = '写入失败'
 ROLLBACK TRANSACTION

RETURN 0
 END 
END
 ELSE 
 BEGIN 
SET @AS_OUT = '写入失败'
RETURN 0
 END 
 END
 GO
 


lz 你这个事务还提交之后,你就输出"写入成功".这个你写的滞后了。
你看看我写的
[解决办法]
 最后的ELSE 是错误,SQL2005以上建议用begin try写事务
 

create  PROCEDURE [dbo].[pro_a] @AS_IN VARCHAR(200), @AS_OUT VARCHAR(200) OUT,  @AI_DO INT OUT
AS
BEGIN
DECLARE @CARDID VARCHAR(8)     
DECLARE @AMOUNT DECIMAL(10,2)  
DECLARE @BUSNUM VARCHAR(12)    
DECLARE @DBNUM VARCHAR(12)   
DECLARE @BDATE VARCHAR(14)    
DECLARE @BDATEA VARCHAR(20)    
DECLARE@LS_VAL VARCHAR(10)
declare @aa    varchar(10)

IF LEN(@AS_IN) >66
BEGIN 
SET @LS_VAL = SUBSTRING(@AS_IN,5,2)
SET @CARDID = SUBSTRING(@AS_IN,12,8)
SET @BUSNUM = SUBSTRING(@AS_IN,42,12)
SET @DBNUM = SUBSTRING(@AS_IN,54,12)
SET @BDATE = SUBSTRING(@AS_IN,20,14)
IF @LS_VAL <> 'XV'
BEGIN
SET @AS_OUT = '写入失败'
RETURN 0
END
SET @AMOUNT = CONVERT(DECIMAL(10,2),CAST(SUBSTRING(@AS_IN,34,8) AS FLOAT)/100)

SET @BDATEA = LEFT(@BDATE,4)+'-'+SUBSTRING(@BDATE,5,2)+'-'+SUBSTRING(@BDATE,7,2)+' '+ SUBSTRING(@BDATE,9,2)+':'+SUBSTRING(@BDATE,11,2)+':'+SUBSTRING(@BDATE,13,2)
BEGIN TRANSACTION

INSERT INTO DBO.table1(CARDID,AMOUNT,BUSNUM,BDATE,DBNUM) VALUES (@CARDID,@AMOUNT,@BUSNUM,@BDATEA,@DBNUM)
IF @@ERROR = 0
BEGIN
COMMIT TRANSACTION
SET @AS_OUT = '写入成功'
RETURN 0
END
ELSE 
BEGIN
ROLLBACK TRANSACTION
SET @AS_OUT = '写入失败'
RETURN 0
END
END

SET @AS_OUT = '写入失败'
RETURN 0

 END
GO

热点排行
Bad Request.