2010-05-20 5 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, но вы должны использовать два 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 
+0

Как может кто-то увидеть это предпочтительнее двух удалений (сначала против «BackupDocument», а затем «Document», с предложением OUTPUT до «FinishedDocument») в транзакции? – lance

+0

@ lance, я не уверен, что вы спрашиваете? В любом случае вам придется иметь 2 DELETE, а INSERT - из предложения OUTPUT. Если вы удалите одну таблицу перед другой, это будет предпочтение, основанное на активности вашего приложения. Сначала я удаляю наименее активную таблицу, поэтому, если есть блокировки, они имеют меньшее влияние. –

0

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

Или cascaded foreign key Предполагая, что у вас есть FK. Или триггер.