2013-04-25 89 views
1

我有一个过程更新表中的x个行数。我创建了一个记录所有更新行的日志表。所以每次我运行我的程序,它会影响例如。 5行,这5行将被插入到我的日志表中。日志记录只影响sql更新过程中的行

这是我的方法:

UPDATE dbo.ImportAdvTemp 
SET dbo.ImportAdvTemp.DeliveryAdrID = dbo.ImportAdvTemp_IMPORTED.DeliveryAdrID 
FROM dbo.ImportAdvTemp, dbo.ImportAdvTemp_IMPORTED 
WHERE 
    ISNULL(dbo.ImportAdvTemp.DeliveryName, '') = ISNULL(dbo.ImportAdvTemp_IMPORTED.DeliveryName, '') AND 
    ISNULL(dbo.ImportAdvTemp.DeliveryStreet,'') = ISNULL(dbo.ImportAdvTemp_IMPORTED.DeliveryStreet, '') AND 
    ISNULL(dbo.ImportAdvTemp.DeliveryHouseNumber, '') = ISNULL(dbo.ImportAdvTemp_IMPORTED.DeliveryHouseNumber, '') AND 
    ISNULL(dbo.ImportAdvTemp.DeliverySubCity, '') = ISNULL(dbo.ImportAdvTemp_IMPORTED.DeliverySubCity, '') AND 
    ISNULL(dbo.ImportAdvTemp.DeliveryPostCode, '') = ISNULL(dbo.ImportAdvTemp_IMPORTED.DeliveryPostCode, '') AND 
    ISNULL(dbo.ImportAdvTemp.DeliveryCity, '') = ISNULL(dbo.ImportAdvTemp_IMPORTED.DeliveryCity, '') AND 
    ISNULL(dbo.ImportAdvTemp.DeliveryCountry, '') = ISNULL(dbo.ImportAdvTemp_IMPORTED.DeliveryCountry, '') AND 
    ISNULL(dbo.ImportAdvTemp.DeliveryCustomer, '') = ISNULL(dbo.ImportAdvTemp_IMPORTED.DeliveryCustomer, '') AND 
    ISNULL(dbo.ImportAdvTemp.DeliveryAlias, '') = ISNULL(dbo.ImportAdvTemp_IMPORTED.DeliveryAlias, '') AND 
    ISNULL(dbo.ImportAdvTemp.DeliveryNote, '') = ISNULL(dbo.ImportAdvTemp_IMPORTED.DeliveryNote, '') AND 
    dbo.ImportAdvTemp.toManualProc = 1 and dbo.ImportAdvTemp.Closed = 0 and(dbo.ImportAdvTemp.DeliveryAdrID IS NULL or dbo.ImportAdvTemp.PickupAdrID IS NULL or dbo.ImportAdvTemp.DeliveryAdrID = 0 or dbo.ImportAdvTemp.PickupAdrID = 0) 

我需要找出哪些行影响,然后用数据从该行我的日志表中插入。我已阅读关于使用游标,是唯一的方法来做到这一点?

回答

2

我对sqlserver了解不多,但在Oracle中,最直接的解决方案是一个UPDATE触发器,它插入到日志表中,我相信你可以在sqlserver中做同样的事情。

关于触发器的好处是,它在代码中保持不变,它执行真正的工作(更新)。您可以禁用或更改触发器,而不会混淆主代码,它只会影响日志记录方面。作为一个方面说明,您可能需要考虑一个行更新(因为它匹配WHERE子句)的情况,但新值和新值是相同的。你是否希望这个记录或不记录,或者你是否通过编写合适的WHERE子句来防止这种情况发生?你是否想要记录旧的,新的vor值?无论日志实施如何,您都必须回答这个问题。

+0

我只想记录更新的行。此过程将用于自动验证记录。我将有一个目录表。该表将包含手动验证的行。如果用相同的vsalues再次插入一行,用户不必验证它,它会自动验证。那么当触发多行时,触发器如何“知道”? – Lahib 2013-04-25 06:05:17

+0

您需要一个FOR EACH ROW触发器。它会针对每个受影响的行启动一次。但是,我在这里说Oracle,我不知道SQLSERVER是否有FOR EACH ROW触发器。 – 2013-04-25 07:23:06

+0

并且这个触发器必须在程序中创建吗? – Lahib 2013-04-25 07:29:49