SQL Server删除脚本排序

4
我的表格具有以下关系
如图所示,FirstEntity 可以与多个相关联的 Transactions 记录。 Transaction 分为两个表,因为它代表继承层次结构 (Entity Framework 中的 Table Per Type)。
我需要创建一个脚本,根据 FirstEntityID 删除所有来自 FirstEntityTransactionTransaction 的记录。删除应按照以下顺序进行:
- 删除 FirstEntityTransaction 的所有记录 - 删除 Transaction 的所有记录 - 删除 FirstEntity 的记录
问题是,当我执行第一个删除 (FirstEntityTransaction) 时,我没有任何方法可以通过 TransactionID 查找相关事务。是否有任何方法可以保存这些 ID,然后执行第二个删除?

@HamletHakobyan:没错。但是删除脚本应该使用纯SQL离线制作。 - Lorenzo
连接表通常用于多对多关系。这是否更适合您的情况?class FirstEntity {public int FirstEntityID{get;set;} public virtual ICollection<EntityTransaction>{get;set;}} class EntityColletion{public int Id{get;set;} public EntityTypeEnum Type{get;set;} - Hamlet Hakobyan
@GiorgosBetsos:因为在FirstEntityTransactionTransaction之间有一个外键,如下所示:ALTER TABLE [dbo].[FirstEntityTransaction] WITH CHECK ADD CONSTRAINT [FK_dbo.FirstEntityTransaction_dbo.Transaction_TransactionID] FOREIGN KEY([TransactionID]) REFERENCES [dbo].[Transaction] ([TransactionID]) - Lorenzo
@HamletHakobyan:在我看来,你建议的方式是“表格继承”,而我现在无法更改。我错了吗? - Lorenzo
@HamletHakobyan:好的,知道了。不过我暂时无法更改设计。 - Lorenzo
显示剩余3条评论
1个回答

6
以下是一个示例,将已删除的实体交易插入到一个表变量中,随后使用该变量来删除Transaction行。
DECLARE @DeletedMyEntityTransaction table ( TransactionID int );

DELETE  dbo.MyEntityTransaction
OUTPUT  deleted.TransactionID
        INTO @DeletedMyEntityTransaction
WHERE   MyEntityID = @MyEntityID;

DELETE  dbo.[Transaction]
WHERE   TransactionID IN ( SELECT   TransactionID
                           FROM     @DeletedMyEntityTransaction );

DELETE  dbo.MyEntity
WHERE   MyEntityID = @MyEntityID;

哇,这对我的情况应该有效。我没有意识到可以使用临时表。我需要在最后删除临时表吗? - Lorenzo
@Lorenzo Dan正在使用一个表格变量。一旦超出其作用域,它将被隐式释放。 - Giorgos Betsos
1
@Lorenzo,你也可以在表变量上创建索引。我建议根据你的表的性质使用JOIN而不是IN。 - Hamlet Hakobyan
@HamletHakobyan,表变量可以在SQL Server中通过索引实现主键和/或唯一约束,但不能使用非唯一索引。可以将MyEntityID添加到表变量中,在变量上声明由TransactionID和EntityID组成的复合主键,并将EntityID添加到OUTPUT子句中。这是否会提高性能(或仅包含Transaction和Transaction上的非唯一索引的常规临时表)是Lorenzo需要测试的内容。 - Dan Guzman
@DanGuzman - 在这种情况下是正确的,因为OP使用的是2012版本,但2014及以上版本支持非唯一索引。 - Martin Smith

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接