求教:sql 事务不回滚 不出错

j119 2011-09-19 09:58:14
存储过程中 将输入的字符串u_Data解析,保存到t_data中,表t_data中,d_headid,d_time是外键,
测试时,如果输入的字符串a中对应d_headid,d_item是错误的,事务不回滚?不进入catch里
是什么原因?
代码
create PROCEDURE [dbo].aaaa
@u_Data as nvarchar(max),
@createtime as datetime,
AS
BEGIN
declare @L int
declare @S int
declare @data nvarchar(100)
declare @i int
declare @j int
declare @upid int

declare @HeadLength int
declare @KindLength int
declare @DataLength int

SET XACT_ABORT ON
set nocount off

begin try
begin tran istart


INSERT INTO [t_up]( ...)
VALUES(.....)

set @upid = @@identity

set @HeadLength = dbo.Get_StrArrayLength(@u_tHead,null)
set @KindLength = dbo.Get_StrArrayLength(@u_tKind,null)
set @DataLength = dbo.Get_StrArrayLength(@u_Data,null)
set @i = 1
set @j = 1
SET @L = 0
SET @S = CHARINDEX(@SPLITCHAR, @u_Data, @L)
while @L<@S
begin

IF @S = 0 SET @S = LEN(@u_Data) + 1

SET @data = SUBSTRING(@u_Data, @L, @S - @L) -- 取值
SET @L = @S + 1
SET @S = CHARINDEX(@SPLITCHAR, @u_Data, @L)


if (case when isnumeric(@data)=1 then cast(@data as numeric(18,2)) else 0 end)=0
begin
set @j = @j +1
if @j > @HeadLength
begin
set @j = 1
set @i = @i + 1
end
CONTINUE
end
INSERT INTO [t_data]
([u_upid] ,[d_headid],[d_item],[d_data])
VALUES(@upid,dbo.Get_StrArray(@u_tHead,null,@j),dbo.Get_StrArray(@u_tKind,null,@i)
,case when isnumeric(@data)=1 then cast(@data as numeric(18,2)) else 0 end)
set @j = @j +1
if @j > @HeadLength
begin
set @j = 1
set @i = @i + 1
end
end
commit tran
set @retState = 0
end try
begin catch
ROLLBACK TRAN
set @retState = -1
end catch
return @retState

END
...全文
101 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
中国风 2011-09-20
  • 打赏
  • 举报
回复
SET       XACT_ABORT       ON--去掉 

直接用
begin try
begin tran


SQL.......

commit tran
end try
begin catch
select Error_Messages
rollback tran
end catch
maoxinsi 2011-09-20
  • 打赏
  • 举报
回复
看看,学习当中
CalvinR 2011-09-20
  • 打赏
  • 举报
回复
肯定有错 才会出现不会滚啊
-晴天 2011-09-19
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 fredrickhu 的回复:]
在你的事务前面加个set xact_abort on
[/Quote]
貌似有.
--小F-- 2011-09-19
  • 打赏
  • 举报
回复
在你的事务前面加个set xact_abort on
j119 2011-09-19
  • 打赏
  • 举报
回复
可能我没说明白,如果字符串里对应的d_headid ,d_item是空值或者不是对应表的键值的话,也不进入catch里
-晴天 2011-09-19
  • 打赏
  • 举报
回复
有逻辑错误,出现问题,才会回滚,你这个不会出现逻辑错误,只是结果错误,DBMS又不能判断你查的东西怎么样才算是错,当然不回滚了.

34,588

社区成员

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

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