转换失败时T-SQL回滚

转换失败时T-SQL回滚,sql,sql-server,tsql,Sql,Sql Server,Tsql,我们正在整合我们的ERP和CRM。两者都是第三方应用程序,我们无权对其进行更改。我们有大约20个表需要同步。我们正在使用一个事务。如果某些转换失败,我们希望回滚并将错误写入日志表。到目前为止,代码已超过4000行,张贴在pastebin上。下面列出了婚姻状况的一个例子。如果婚姻状况代码与任何条件都不匹配,那么我们希望回滚并在日志表中写入错误。我们是在else语句中编写rollback命令,还是需要将整个过程嵌套在try-catch中 我正在使用SQLServer2008R2 --UMARSTAT

我们正在整合我们的ERP和CRM。两者都是第三方应用程序,我们无权对其进行更改。我们有大约20个表需要同步。我们正在使用一个事务。如果某些转换失败,我们希望回滚并将错误写入日志表。到目前为止,代码已超过4000行,张贴在pastebin上。下面列出了婚姻状况的一个例子。如果婚姻状况代码与任何条件都不匹配,那么我们希望回滚并在日志表中写入错误。我们是在else语句中编写rollback命令,还是需要将整个过程嵌套在try-catch中

我正在使用SQLServer2008R2

--UMARSTAT, 
case PC.UMARSTAT --nvarchar(4) map is wrong
   when 'D' then 'DVRC'
   when 'M' then 'MARR'
   when 'O' then 'UNKN'
   when 'S' then 'SNGL'
   when 'U' then 'UNKN'
   when 'W' then 'WDWD'
   when 'X' then 'S'
   else -- we want to rollback and write error in our log table.
end as marital_status, --PC

这取决于转换失败时的含义

如果它以生成错误的方式失败,那么您需要在try-catch块中回滚


但在您的示例代码中,fails只表示未满足某个条件,但不会引发错误。在这种情况下,ELSE是执行回滚或显式引发错误的正确位置,该错误将导致try-catch块中的回滚。问题中的代码示例不会导致错误,因此不会执行catch块中的任何回滚。

使用try catch并在那里回滚。看看:您正在使用一个事务在两个独立的应用程序之间集成20个表?为什么这样?这种集成来自CRM,所以它是联系人记录。我们正在将其发布到ERP。如果记录未完成,它必须失败并在日志表中写入错误,以便CRM管理员可以完成记录并再次启动集成。对于其他错误,我们使用第3117行-检查日志以在需要时引发回滚,如果选择@LogErrors>0中的COUNT1,则引发“TRY block中引发的错误”,-信息文本。16-严重性。1-国家;这些错误是重复键或由于某种原因导致插入失败。使用同样的方法有意义吗?那么只需在logerrors中添加一个错误行?