当前位置: 代码迷 >> Sql Server >> 求实现逻辑 有一批数据 while循环每条数据 一条出有关问题不让回滚 继续处理下一条
  详细解决方案

求实现逻辑 有一批数据 while循环每条数据 一条出有关问题不让回滚 继续处理下一条

热度:66   发布时间:2016-04-24 09:54:02.0
求实现逻辑 有一批数据 while循环每条数据 一条出问题不让回滚 继续处理下一条
如标题  
现在有一批数据    通过while循环   一条一条的 处理  
当然 在while 循环外面 有 事务    成功 提交  失败回滚     
现在情况是  当处理每条的时候   碰到 整形溢出   字符串超长   字符串不能转为int 型的 错误 
就立马回滚了    整批数据 都不能被 处理 

想实现    其中一条数据出现 问题后   不让处理终了    记录下log  跳过这条数据 继续 处理下一条数据  

求实现方法??
------解决思路----------------------
BREAK 跳出当前循环,继续下一次循环
------解决思路----------------------
不符合条件的先过滤出来然后再更新
------解决思路----------------------

看看这个列子 是不是你要的?

create table a  (name varchar(10),id int identity(1,1))
insert into a values('1'),('2'),('3'),
('a'),('b'),('4'),('5'),('6'),('7')

declare @id int =1,@name int 
while @id<=(select MAX(id) from a)
begin 
begin try
 select @name=CONVERT(int,name) from a  where ID=@id
 print @name
end try 
begin catch 
print ERROR_MESSAGE()
end catch
set @id=@id+1
 end  

--结果
1
2
3
在将 varchar 值 'a' 转换成数据类型 int 时失败。
在将 varchar 值 'b' 转换成数据类型 int 时失败。
4
5
6
7


------解决思路----------------------
你这个是批量导入吗,如果是,那么在程序中就进行各种检查,然后再一起导入
------解决思路----------------------
加个 TRY..CATCH 就可以继续了。
DECLARE @i int
SET @i = 0
WHILE @i<3
BEGIN
    SET @i = @i+1

    BEGIN TRY
        PRINT '[DEBUG]START '+CONVERT(varchar(11),@i)

        IF @i = 2
            --模拟出错
            SELECT CONVERT(int,'12345678901234567890')
        ELSE
            SELECT CONVERT(int,'1234567890')

        PRINT '[DEBUG]COMPLITE '+CONVERT(varchar(11),@i)
    END TRY
    BEGIN CATCH
        SELECT 
            ERROR_NUMBER() as ErrorNumber,
            ERROR_MESSAGE() as ErrorMessage;
    END CATCH
END

PRINT '[DEBUG]TOTAL '+CONVERT(varchar(11),@i)
  相关解决方案