2010-05-20 35 views
1

这将从Document表中删除文档,并将有关已删除文档的信息输出到FinishedDocument表中。使用一个OUTPUT子句从两个表中删除?

DELETE 
FROM Document 
OUTPUT Deleted.DocumentId 
    , Deleted.DocumentDescription 
INTO FinishedDocument 
WHERE DocumentId = @DocumentId 

我需要不只是从Document表,但也从DocumentBackup表中删除该文件。同时,我需要保持插入FinishedDocument

这一切只有一个语句可能吗?如果没有,是第二个DELETE(针对DocumentBackup),它的所有包裹在一个交易中,要走的路?

回答

1

您需要两个DELETE,但是您应该在第一个DELETE上使用两个OUTPUTS来执行插入FinishedDocument和插入表变量以保存所有已删除的文档。

尝试:

DECLARE @DeletedDocuments table (DocumentId int) 

BEGIN TRANSACTION 

DELETE 
    FROM Document 
    OUTPUT Deleted.DocumentId, Deleted.DocumentDescription 
     INTO FinishedDocument 
    OUTPUT Deleted.DocumentId 
     INTO @DeletedDocuments 
WHERE DocumentId = @DocumentId 

DELETE 
    FROM DocumentBackup 
    WHERE EXISTS (SELECT 1 FROM @DeletedDocuments d WHERE DocumentBackup.DocumentId=d.DocumentId) 


COMMIT 
+0

某人在事务中可能会如何将这看作优于两次删除(首先针对'BackupDocument',然后针对'Document',OUTPUT子句为'FinishedDocument')? – lance 2010-05-20 15:40:14

+0

@lance,我不确定你在问什么?无论如何,你必须有2个DELETE,INSERT来自OUTPUT子句。如果先删除一个表格,那么这将是基于应用程序活动的首选项。我会先删除最不活跃的表,如果有锁,它们的影响就会减小。 – 2010-05-20 19:28:02

0

由于公里提到的,这是2个删除。

或假设你有FK的cascaded foreign key。或者一个触发器。