/ / видалення записів з декількох таблиць одночасно з одним запитом у sqlserver2005 - sql-server-2005, delete-row

Видалення записів з декількох таблиць одночасно з одним запитом у sqlserver2005 - sql-server-2005, delete-row

Я хочу видалити записи з дочірніх таблиць, а також батьківської таблиці в одному запиті. будь ласка, знайдіть запит, поданий нижче. тут заголовок відповіді - це первинна таблиця, а responseid - первинний ключ.

DELETE FROM responseheader
FROM responseheader
INNER JOIN responsepromotion ON responseheader.responseid = responsepromotion.ResponseID
INNER JOIN responseext ON responsepromotion.ResponseID=responseext.ResponseID
WHERE responseheader.responseid In ("67D8B9E8-BAD2-42E6-BAEA-000025D56253")

але її помилка кидання. може хтось допоможе мені з’ясувати правильний запит

Відповіді:

3 для відповіді № 1

Якщо ви не використовуєте якесь каскадне видалення, один оператор видалення видалить рядки з однієї таблиці.

У вашому прикладі, якщо синтаксис правильний, ви будете видаляти рядки з responseheader лише решта таблиць використовуються лише для визначення, з яких рядків видалити responseheader.

Щоб бути тупим, ти дійсно не хочу використовувати каскадне видалення, тому вам слід виконати кілька операцій видалення, по одному у кожній таблиці.


0 для відповіді № 2

Ви можете створити збережену процедуру і викликати цю збережену процедуру для видалення. Або ви можете використовувати sp_executesql для надсилання пакетних запитів за один раз:

sp_executesql

"DELETE FROM responsepromotion
FROM responsepromotion
INNER JOIN responseheader ON responseheader.responseid = responsepromotion.ResponseID
WHERE responseheader.responseid = @guid;

DELETE FROM responseext
FROM responseext
INNER JOIN responseheader ON responsepromotion.ResponseID=responseext.ResponseID
WHERE responseheader.responseid = @guid;

DELETE FROM responseheader
WHERE responseid = @guid;",

@guid = "67D8B9E8-BAD2-42E6-BAEA-000025D56253"

0 для відповіді № 3

Як згадував Lasse, каскадне видалення є єдинимможливість видалення з декількох таблиць за допомогою одного запиту. Для цього слід встановити зовнішній ключ і видалити запис у головній таблиці. Там за рядками в дочірній таблиці буде видалено. Але його краще не використовувати. Краще буде використовувати декілька операторів видалення. Ви також можете використовувати транзакцію, встановивши для автоматичного фіксації значення false. Потім видаліть рядки та вручну зафіксуйте або відкатуйте за необхідності.