我在更新时设置了触发器。
如果我更新10行,则第一个IF块将向更改日志插入10行 但是下一个IF语句只会更新一行......而不是10行
第一个IF语句IF @attribute <> 'totalDescriptionLong'
会触发10次,就像我预期的那样。
下一个IF声明IF @attribute = 'publishingStatus'
似乎只发射一次......即使我正在更新10行或更多行符合此条件......!
我不明白为什么代码的一部分以另一种方式行事
ALTER TRIGGER [dbo].[AttributeUpdate]
ON [DemandwareDataHub].[dbo]. [RETAILEXPORTOUTPUTEXTHUBDWATTRIBUTE]
AFTER UPDATE
AS
DECLARE @nOldValue int, @nNewValue int,
@attribute nvarchar(60), @attributeValue nvarchar(1999)
SELECT @nNewValue = i.Active
FROM inserted i
SELECT @nOldValue = d.Active FROM deleted d
SELECT @attribute = i.ATTRIBUTE FROM inserted i
Select @attributeValue = i.ATTRIBUTEVALUE from inserted i
IF @attribute <> 'totalDescriptionLong'
BEGIN
IF @nOldValue <> @nNewValue
BEGIN
IF EXISTS(SELECT * FROM Inserted)
BEGIN
INSERT INTO [DemandwareDataHub].[dbo].[ChangeLog] (ReferenceRecid, EntityTypeID, ActionType, LogEntryDateTime, PimChangeDateTime, Processed)
--values( 2, 1, 1, getdate(),getdate(),0)
SELECT i.RECID, 1, 1, getdate(), i.TIMESTAMP,0 from Inserted i
--INSERT INTO ChangeLog (ReferenceRecid, EntityTypeID, ActionType) VALUES (1, 1, 1)
END
END
ELSE
BEGIN
IF EXISTS(SELECT * FROM Inserted)
BEGIN
INSERT INTO [DemandwareDataHub].[dbo].[ChangeLog] (ReferenceRecid, EntityTypeID, ActionType, LogEntryDateTime, PimChangeDateTime, Processed)
--values( 2, 1, 1, getdate(),getdate(),0)
SELECT i.RECID, 1, 2, getdate(), i.TIMESTAMP,0 from Inserted i
--INSERT INTO ChangeLog (ReferenceRecid, EntityTypeID, ActionType) VALUES (1, 1, 1)
END
END
END
IF @attribute = 'publishingStatus'
BEGIN
Declare @Product bigint, @Site nvarchar(60)
Select @Product = i.PRODUCT from inserted i
Select @Site = i.SITE from inserted i
IF @attributeValue = 'proofedPriceCheck'
BEGIN
--This product has been proofed and is ready for a price check
Declare @PriceLocked bit
set @PriceLocked = 0
SELECT TOP (1) @PriceLocked = a.PRICELOCKED
FROM RETAILEXPORTOUTPUTEXTDWPRICELOCKED AS a INNER JOIN
SyncPimPriceBooks AS b ON a.ACCOUNTRELATION = b.CountryID
WHERE (a.PRODUCT = @Product) AND (b.SiteID = @Site)
IF @PriceLocked = 1
BEGIN
UPDATE RETAILEXPORTOUTPUTEXTHUBDWATTRIBUTE
SET ATTRIBUTEVALUE = 'proofed'
WHERE (PRODUCT = @Product) AND (SITE = @Site) AND (ATTRIBUTE = 'publishingStatus')
END
ELSE
BEGIN
UPDATE RETAILEXPORTOUTPUTEXTHUBDWATTRIBUTE
SET ATTRIBUTEVALUE = 'proofedPriceNotLocked'
WHERE (PRODUCT = @Product) AND (SITE = @Site) AND (ATTRIBUTE = 'publishingStatus')
END
END
END
答案 0 :(得分:2)
我认为这应该非常接近。我对插入非常有信心,但更新可能需要稍微调整一下。当然我大多猜测,因为我没有桌面结构,也没有100%确定你想要做什么。这应该非常接近。
insert [DemandwareDataHub].[dbo].[ChangeLog]
(
ReferenceRecid
, EntityTypeID
, ActionType
, LogEntryDateTime
, PimChangeDateTime
, Processed
)
select i.RECID
, 1
, case when i.Active <> d.Active then 1 else 2 end
, getdate()
, i.TIMESTAMP
, 0
from inserted i
join deleted d on d.RECID = i.RECID --or whatever the primary key column(s) are
UPDATE RETAILEXPORTOUTPUTEXTHUBDWATTRIBUTE
set ATTRIBUTEVALUE = case when re.PRICELOCKED = 1 then 'proofed' else 'proofedPriceNotLocked' end
from inserted i
join SyncPimPriceBooks b on b.SiteID = i.SITE
join RETAILEXPORTOUTPUTEXTDWPRICELOCKED re on re.ACCOUNTRELATION = b.CountryID AND re.PRODUCT = i.PRODUCT
where re.ATTRIBUTE = 'publishingStatus'