УДАЛИТЬ из двух таблиц с одним предложением OUTPUT?

Это удалит документ из таблицы Document и выведет информацию об удаленном документе в таблицу FinishedDocument.

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

Мне нужно удалить документ не только из таблицы Document, но и из таблицы DocumentBackup. Тем временем мне нужно сохранить вставку в FinishedDocument.

Возможно ли все это с помощью только одного оператора? Если нет, можно ли использовать второй DELETE (против DocumentBackup) со всем этим, обернутым в транзакцию?


person lance    schedule 20.05.2010    source источник


Ответы (2)


Вам понадобятся два DELETE, но вы должны использовать два OUTPUTS для первого DELETE, чтобы выполнить вставку как в 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
person KM.    schedule 20.05.2010
comment
Как кто-то может счесть это более предпочтительным, чем два удаления (сначала против BackupDocument, а затем против Document, с предложением OUTPUT для FinishedDocument) в транзакции? - person lance; 20.05.2010
comment
@lance, я не понимаю, о чем ты спрашиваешь? В любом случае вам нужно будет иметь 2 DELETE, причем INSERT исходит из предложения OUTPUT. Если вы удалите одну таблицу перед другой, это будет предпочтение, основанное на активности вашего приложения. Я бы сначала удалил наименее активную таблицу, поэтому, если есть какие-либо блокировки, они оказывают меньшее влияние. - person KM.; 20.05.2010

Как уже упоминал КМ, это 2 удаления.

Или каскадный внешний ключ, если у вас есть FK. Или триггер.

person gbn    schedule 20.05.2010