2010-01-27 121 views
1

在可能插入多行的数据库插入语句中,如果在第1行(很多)中有错误,我将如何知道确切的错误是什么 - 哪一行和哪一列?有任何想法吗?SQL Server插入语句

+1

你有一个确切的例子吗?发布示例查询... – 2010-01-27 00:45:25

回答

2

如果发生错误,事务将被回退,并且不会插入行。

即使您没有使用begin transaction明确启动事务,SQL Server也不会在事务外运行insert语句。默认情况下,它会为您启动一个并在每个语句后提交。在自动提交中查看此MSDN article

找出确切行,你可以插入他们一次一个,也许使用临时表:

select * into #tmp from <YourInsertQuery> 
while @@rowcount > 0 
    begin   
    insert into TargetTable 
    select top 1 * 
    from #tmp tmp 
    where not exists (
     select * 
     from TargetTable tt 
     where tt.id = tmp.id 
    ) 
    order by id 
    end 

一旦失败,顶行中#tmp这不是在TargetTable导致错误。

+0

我想知道错误发生的位置 - 如果我插入5行,如果第4行有问题,我需要找出第4行失败,并且如果可能的话,哪个列有问题 – 2010-01-27 00:46:47

1

首先它取决于你得到的错误。有很多错误可以发生,没有特定的错误行。但让我们考虑一下,错误是由特定行引起的约束违规。在这种情况下,行插入在一起的事实意味着它们是单个事务更新,所以它们都必须成功,否则都必须失败,通常插入一半行是没有意义的,因为它会使数据库不一致。

Finaly让我们考虑一致性不是问题,你真的只想插入可以成功的行。在这种情况下,您应该查看错误消息,因为它会指示出现问题。如果是主要约束违规,那么问题与重复键一致。检查约束,然后是检查失败的行。通过检查错误信息,检查目标表并检查要插入的候选行,可以揭示罪魁祸首。

如果您想自动执行进程并在发生约束失败后继续执行,您别无选择,只能一次插入一行。在这种情况下,失败只会发生一行,这就是问题所在。