我有以下情况:存储过程收集数据并执行必要的连接并将结果插入临时表(例如:#Results)
现在,我想要做的是将#Results中的所有记录插入到先前创建的表中,但我首先要删除(截断/删除)目标,然后插入结果。问题在于清理目标表,然后在事务中插入新的#Results。
我做了以下事情:
BEGIN TRANSACTION
DELETE FROM PracticeDB.dbo.TransTable
IF @@ERROR <> 0
ROLLBACK TRANSACTION
ELSE
BEGIN
INSERT INTO PracticeDB.dbo.TransTable
(
[R_ID]
,[LASTNAME]
,[FIRSTNAME]
,[DATASOURCE]
,[USER_STATUS]
,[Salary]
,[Neet_Stat]
)
SELECT [R_ID]
,[LASTNAME]
,[FIRSTNAME]
,[DATASOURCE]
,[USER_STATUS]
,[Salary]
,[Neet_Stat]
FROM #RESULT
Select @@TRANCOUNT TransactionCount, @@ERROR ErrorCount
IF @@ERROR <> 0
ROLLBACK TRANSACTION
ELSE
COMMIT TRANSACTION
END
但是我知道它工作不正常而且我很难找到这样的例子,虽然我不知道为什么考虑它看起来像是常见的东西。在这种情况下,尽管插入失败,它仍会删除目标表。
最重要的是,一些指导会很好,以便最好地处理这种情况或类似情况下的最佳实践(最好使用等等)。提前谢谢你......
答案 0 :(得分:1)
我真的没有看到任何错误。所以它从您的TransTable中删除,但不插入?你确定#RESULT中有记录吗?
我唯一看到的是你在@@ERROR
之后检查Select @@TRANCOUNT TransactionCount, @@ERROR ErrorCount
,这意味着@@ ERROR将来自你的SELECT语句,而不是INSERT语句(尽管我会永远期望是0)。
有关@@ ERROR的更多信息,请参阅:http://msdn.microsoft.com/en-us/library/ms188790.aspx
你应该在每个陈述后检查@@ ERROR。
就最佳实践而言,我认为Microsoft现在建议您在每个语句之后使用TRY / CATCH而不是检查@@ ERROR(从SQL 2005及之后)。请在此处查看示例B:http://msdn.microsoft.com/en-us/library/ms175976.aspx