SQL Server存储过程从sql批量插入返回失败的记录

时间:2015-05-28 12:32:36

标签: sql sql-server sql-server-2012

我有一个包含以下代码的存储过程

INSERT INTO  contribution(
                eligibility_id, 
                earnings, 
                member, 
                employer, 
                begin_date, 
                end_date,
                active,
                os_user_name,
                date_modified,
                sql_user_name,
                date_created,
                eligible_fl
    )

    select
            eligibility_id, 
                earnings, 
                member, 
                employer, 
                begin_date, 
                end_date,
                active,
                os_user_name,
                date_modified,
                sql_user_name,
                date_created,
                eligible_fl
     from @ContributionIns

是否可以从此存储过程返回失败的记录或插入的记录?

2 个答案:

答案 0 :(得分:4)

您可以使用OUTPUT子句返回插入的记录。

INSERT INTO [Table] (<columns>) 
OUTPUT inserted.* 
SELECT <columns> 
FROM @ContributionIns;

在单个insert语句中不能混合使用失败和成功的插入,因此要么插入所有记录,要么全部失败。因此,您可以使用try / catch块:

BEGIN TRY
    INSERT INTO [Table] (<columns>) 
    OUTPUT 'Success' AS [Status], inserted.* 
    SELECT <columns> 
    FROM @ContributionIns;
END TRY
BEGIN CATCH

    SELECT  'Failed' AS [Status], 
            <columns> 
    FROM    @ContributionIns;

END CATCH

虽然我个人不喜欢SQL Server中的这种方法,但我认为99%的时候你最好让错误传播,并且知道如果你收到错误,所有的记录都会失败

答案 1 :(得分:1)

您的SQL语句是单个语句,因此它不会仅插入那些“成功”的记录。然后整个语句将失败并且不会插入任何记录,否则它将成功并插入所有记录。根据您的查询,除了违反主键/外键或唯一索引之外,很难知道会失败的是什么。

期望中,某些记录会因某些条件(违反约束等)而失败,那么您需要提前检查这些违规行为,并且只尝试插入您所记录的记录合理肯定会成功。