2010-05-20 10 views
1

Ceci supprime le document de la table Document et génère des informations sur le document supprimé dans le tableau FinishedDocument.SUPPRIMER à partir de deux tables avec une clause OUTPUT?

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

J'ai besoin de supprimer le document non seulement de la table Document, mais aussi de la table DocumentBackup. En attendant, je dois maintenir l'insertion dans FinishedDocument.

Est-ce que tout cela est possible avec une seule instruction? Si non, est une seconde DELETE (contre DocumentBackup), avec tout cela enveloppé dans une transaction, le chemin à parcourir?

Répondre

1

Vous aurez besoin de deux suppressions, mais vous devez utiliser deux OUTPUTS sur le premier DELETE pour faire à la fois l'insertion dans FinishedDocument et dans une variable de table pour enregistrer tous les documents supprimés.

essayer:

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

Comment une personne peut-elle voir cela comme préférable à deux suppressions (d'abord contre 'BackupDocument', puis contre' Document', avec la clause OUTPUT à 'FinishedDocument') dans une transaction? – lance

+0

@lance, je ne suis pas sûr de ce que vous demandez? Dans tous les cas, vous devrez avoir 2 DELETE, avec l'INSERT provenant d'une clause OUTPUT. Si vous supprimez une table avant l'autre, ce serait une préférence basée sur l'activité de votre application. Je supprimerais d'abord la table la moins active, donc s'il y a des verrous ils ont moins d'impact. –

0

Comme KM mentionné, il est 2 supprime.

Ou un cascaded foreign key en supposant que vous avez un FK. Ou un déclencheur.