gpt4 book ai didi

sql - 修改 SQL 触发器以在插入的表包含多行时工作

转载 作者:行者123 更新时间:2023-12-02 22:26:59 24 4
gpt4 key购买 nike

我有一个为 SQL Server 2008 中的表编写的 SQL 触发器。当“插入”表中只有一行时,它运行良好。当有多行时,如何修改此触发器以使其正常工作?性能是这里的关键,所以我想远离游标、临时表等(如果可能的话)。

本质上,触发器会检查“ClientID”或“TemplateID”字段是否已更改。如果它们是,并且 OriginalClientID 或 OriginalTemplateID 字段为空,它会填充它们(因此将 OriginalXXX 字段设置一次且仅一次,这样我总能看到第一个值是什么)。

CREATE TRIGGER [dbo].[trigSetOriginalValues]
ON [dbo].[Review]
FOR INSERT, UPDATE
AS
BEGIN
IF (NOT UPDATE(TemplateID) AND NOT UPDATE(ClientID)) return

DECLARE @TemplateID int
DECLARE @OriginalTemplateID int
DECLARE @ClientID int
DECLARE @OriginalClientID int
DECLARE @ReviewID int

SET @ReviewID = (SELECT ReviewID FROM inserted)
SET @ClientID = (SELECT ClientID FROM inserted)
SET @TemplateID = (SELECT TemplateID FROM inserted)
SET @OriginalTemplateID = (SELECT OriginalTemplateID FROM inserted);
SET @OriginalClientID = (SELECT OriginalClientID FROM inserted);

IF (@OriginalTemplateID IS NULL AND @TemplateID IS NOT NULL)
BEGIN
UPDATE [dbo].[Review] SET OriginalTemplateID = @TemplateID WHERE ReviewID=@ReviewID
END

IF (@OriginalClientID IS NULL AND @ClientID IS NOT NULL)
BEGIN
UPDATE [dbo].[Review] SET OriginalClientID = @ClientID WHERE ReviewID=@ReviewID
END
END

最佳答案

这应该是你的触发器:

UPDATE A
SET A.OriginalTemplateID = B.TemplateID
FROM [dbo].[Review] A
INNER JOIN INSERTED B
ON A.ReviewID = B.ReviewID
WHERE A.OriginalTemplateID IS NULL AND B.TemplateID IS NOT NULL

UPDATE A
SET A.OriginalClientID = B.ClientID
FROM [dbo].[Review] A
INNER JOIN INSERTED B
ON A.ReviewID = B.ReviewID
WHERE A.OriginalClientID IS NULL AND B.ClientID IS NOT NULL

虽然您仍然可以在单个 UPDATE 上执行此操作,但使用更复杂的过滤器。

关于sql - 修改 SQL 触发器以在插入的表包含多行时工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12825727/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com