插入内部事务后删除

时间:2011-02-09 18:10:48

标签: sql-server tsql transactions

我继承了一个噩梦般的WTF sproc,它将300k行插入到一个外向营销电子邮件表中。我们不希望将邮件排队到弹跳的电子邮件地址。我们有一个单独的弹跳电子邮件表。

执行此操作的正确方法是修改sproc以不插入用于弹出电子邮件的行。

没有人想要触摸这个特殊的sproc的噩梦般的群集。我们正在考虑在sproc中添加一个删除命令。

BEGIN TRANSACTION

    --400+ lines of nightmarish WTF T-SQL, string and XML replacement nonsense goes here--
    DELETE FROM EmailQueueItems 
WHERE ToAddress IN 
    (SELECT EmailStatuses.Email FROM EmailStatuses 
        INNER JOIN EmailEventTypes on EmailEventTypes.EmailEventTypeId = EmailStatuses.EmailEventTypeId
        WHERE  EmailEventTypes.CanSendMarketing = 0)
COMMIT TRANSACTION

所以......这会有效吗?我可以在事务提交之前从表中删除插入吗?

2 个答案:

答案 0 :(得分:0)

是的,您可以在事务中的表中插入记录并删除它们。

尝试此示例以获取概念证明:

declare @foo table (id int)
begin tran

    insert into @foo 
        values (1),(2),(3)

    delete @foo where id = 2

    select * from @foo --will result in 2 rows: 1 and 3

commit tran

答案 1 :(得分:0)

我认为处理插入并正确执行以仅插入所需的记录是比插入然后删除更好的选择。插入250,000条记录和插入300,000条然后删除50,000条记录之间应该存在显着的性能差异。您正在处理额外100,000条不需要处理的记录。咬紧牙关并正确修复过程。