2014-09-24 2 views
0

Вот мой код:Try-Catch: Как я могу узнать значение для его регистрации?

BEGIN TRY 
update [MicrosoftDynamicsAX].[dbo].[SALESLINE] 
     set recid = i.recid 
    FROM [Integration].[dbo].[CrmOrderDetails] c WITH(NOLOCK) 
    left outer join [MicrosoftDynamicsAX].[dbo].[SALESTABLE] s WITH(NOLOCK) 
     on cast(c.salesorderid as varchar(50)) = s.CRMGUID 
    left outer join [MicrosoftDynamicsAX].[dbo].[INVENTTABLE] it WITH(NOLOCK) 
     on it.NAMEALIAS = c.productidname  
    left outer join [MicrosoftDynamicsAX].[dbo].[INVENTTABLEMODULE] i WITH(NOLOCK) 
     on it.ITEMID = i.ITEMID 
     and i.MODULETYPE = 2 -- sales order 
    left outer join [MicrosoftDynamicsAX].[dbo].[SALESLINE] sl WITH(NOLOCK) 
     on sl.SALESID = s.SALESID 
     and sl.ITEMID = it.itemid 
END TRY 
BEGIN CATCH 
INSERT INTO [Integration].[dbo].[PackageError] 
      ([ID] 
      ,[PackageName] 
      ,[PackageStep] 
      ,[ErrorDescription]) 
    SELECT 'RECID VALUE HERE', 'CrmToAxOrders', 'UpdateSalesLineSP', ERROR_MESSAGE() ; 

END CATCH 

Как получить i.recid значение, ошибки, так что я могу войти к столу PackageError? Я не вижу способа определить, какой recid вызвал ошибку.

Благодаря

ответ

0

вы знаете, какие ошибки вы/будете получать? Если вы знаете ошибку, вы можете найти неработающие записи даже до попытки/улова.

Обратите внимание, что ваш запрос использует левые соединения и не связывает таблицу обновлений с записями. Могла ли она быть переработана так, чтобы она только обновляла найденные записи.

update s1 
    set recid = i.recid 
FROM [Integration].[dbo].[CrmOrderDetails] c 
inner join [MicrosoftDynamicsAX].[dbo].[SALESTABLE] s 
    on cast(c.salesorderid as varchar(50)) = s.CRMGUID 
inner join [MicrosoftDynamicsAX].[dbo].[INVENTTABLE] it 
    on it.NAMEALIAS = c.productidname  
inner join [MicrosoftDynamicsAX].[dbo].[INVENTTABLEMODULE] i 
    on it.ITEMID = i.ITEMID 
    and i.MODULETYPE = 2 -- sales order 
inner join [MicrosoftDynamicsAX].[dbo].[SALESLINE] sl 
    on sl.SALESID = s.SALESID 
    and sl.ITEMID = it.itemid 

таким образом он обновляет связанные записи s1, и только если они были найдены в других таблицах. Кроме того, использование WITH (NOLOCK) приведет к восстановлению записей, которые еще не были привязаны к базе данных, более безопасно только корректировать значения, которые были зафиксированы.