我有一个更新表中x行数的过程。我创建了一个日志表,其中包含所有更新行的记录。因此,每次我运行我的程序,它会影响,例如。 5行,然后将这5行插入到我的日志表中。
这是我的程序:
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)
我需要确定哪些行受影响,然后使用该行中的数据插入我的日志表中。我读过有关使用游标的内容,这是唯一的方法吗?
答案 0 :(得分:2)
我对sqlserver了解不多,但在Oracle中,最直接的解决方案是UPDATE触发器,它插入到日志表中,我相信你可以在sqlserver中做同样的事情。
关于触发器的好处是它在代码中保持不受影响,这可以完成真正的工作(更新)。您可以在不弄乱主代码的情况下禁用或更改触发器,它只会影响日志记录方面。
作为旁注,您可能需要考虑一个更新行(因为它与WHERE子句匹配)的位置,但旧值和新值是相同的。您是否希望记录或不记录,或者您是否通过编写appropritate WHERE子句来防止这种情况发生?你想要旧的,新的vor两个值记录?无论日志记录的实现如何,您都必须回答这个问题。