我有一个包含以下代码的存储过程
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
是否可以从此存储过程返回失败的记录或插入的记录?
答案 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语句是单个语句,因此它不会仅插入那些“成功”的记录。然后整个语句将失败并且不会插入任何记录,否则它将成功并插入所有记录。根据您的查询,除了违反主键/外键或唯一索引之外,很难知道会失败的是什么。
在期望中,某些记录会因某些条件(违反约束等)而失败,那么您需要提前检查这些违规行为,并且只尝试插入您所记录的记录合理肯定会成功。