Sql server 插入内部事务后删除

Sql server 插入内部事务后删除,sql-server,tsql,transactions,Sql Server,Tsql,Transactions,我继承了一个噩梦般的WTF存储过程,在一个出站营销电子邮件表中插入30万行。我们不希望将邮件排队到正在跳转的电子邮件地址。我们有一个单独的表格,上面有大量的邮件 正确的方法是修改存储过程,使其不插入用于跳转电子邮件的行 没有人想去碰那噩梦般的乱七八糟的东西,这就是这场特别的狂欢。我们正在考虑向存储过程中添加一个delete命令 BEGIN TRANSACTION --400+ lines of nightmarish WTF T-SQL, string and XML replacem

我继承了一个噩梦般的WTF存储过程,在一个出站营销电子邮件表中插入30万行。我们不希望将邮件排队到正在跳转的电子邮件地址。我们有一个单独的表格,上面有大量的邮件

正确的方法是修改存储过程,使其不插入用于跳转电子邮件的行

没有人想去碰那噩梦般的乱七八糟的东西,这就是这场特别的狂欢。我们正在考虑向存储过程中添加一个delete命令

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

所以。。。。这样行吗?我可以在事务提交之前删除表中的插入项吗

是的,您可以在事务中的表中插入和删除记录

请尝试此示例以验证概念:

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

是的,您可以在事务中的表中插入和删除记录

请尝试此示例以验证概念:

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

我认为处理插入并正确地插入您想要的记录比插入然后删除更好。插入250000条记录与插入300000条记录,然后删除50000条记录之间的性能应该有很大的差异。您正在处理不需要处理的额外100000条记录。咬紧牙关,正确地修复流程

我认为处理插入并正确地插入您想要的记录比插入然后删除更好。插入250000条记录与插入300000条记录,然后删除50000条记录之间的性能应该有很大的差异。您正在处理不需要处理的额外100000条记录。咬紧牙关,正确地修复流程

如果问题可以归结为:你能在一个事务中插入和删除相同的记录吗?答案是肯定的。是的,但如果我简单地问这个问题,人们可能会说“是的,但是让你的代码更好,这样就不必了。”这可以简单地通过尝试来回答。好的。听起来很棒。你能不能通宵照看这个过程,看看它是否因此死亡?谢谢如果问题可以归结为:你能在一个事务中插入和删除相同的记录吗?答案是肯定的。是的,但如果我简单地问这个问题,人们可能会说“是的,但是让你的代码更好,这样就不必了。”这可以简单地通过尝试来回答。好的。听起来很棒。你能不能通宵照看这个过程,看看它是否因此死亡?谢谢在大插入(300k插入)上执行此操作,然后执行50k删除,是否有任何影响?这将需要更长的时间,可能会发生阻塞。在大插入(300k插入)上执行此操作,然后执行50k删除,是否有任何影响?这将需要更长的时间,并且可能会发生阻塞“不要这样做”是正确的答案。问题在于400多行动态T-SQL加上XML解析加上字符串连接的参数开关,再加上修复存储过程所带来的其他数不清的恐惧。我们的计划是扔掉这场闹剧,扔掉调用它的更糟糕的应用程序,重写整个混乱局面。下个月。现在,俗气的黑客必须这么做。绝对“不要这样做”是正确的答案。问题在于400多行动态T-SQL加上XML解析加上字符串连接的参数开关,再加上修复存储过程所带来的其他数不清的恐惧。我们的计划是扔掉这场闹剧,扔掉调用它的更糟糕的应用程序,重写整个混乱局面。下个月。就目前而言,这些俗气的黑客将不得不这么做。