Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Удаление записей со многих таблиц  [new]
YUAR
Member

Откуда:
Сообщений: 4
Здравствуйте.
Необходимо удалить записи с основной и дочерних таблиц.
Написали скриптик, который поочередно удаляет записи сначала с дочерних , а потом с основной таблицы. Вопрос в том, что необходимо удалить не одну строку, а значительно больше. Сейчас вручную подставляем id-шник строки в основной таблице, который необходимо удалить.
Как написать цикл(или что либо еще) который будет перебирать все id-шники из заранее подготовленной выборки?
Спасибо.
18 сен 13, 03:42    [14852083]     Ответить | Цитировать Сообщить модератору
 Re: Удаление записей со многих таблиц  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Зачем цикл то? Заполняйте какую-нибудь временную табличку списком нужных id и в команде удаления джоинте таблицу из которой удаляете с этой временной таблицей.
Что-то типа

delete t1
from Tabl1 t1
join #TempTbl t on t1.id = t.id

delete t1
from Tabl2 t1
join #TempTbl t on t1.id = t.id
.
.
.
delete t1
from Tabln t1
join #TempTbl t on t1.id = t.id
18 сен 13, 06:34    [14852109]     Ответить | Цитировать Сообщить модератору
 Re: Удаление записей со многих таблиц  [new]
SQL Refactor Studio Team
Member

Откуда:
Сообщений: 84
Можно воспользоваться подходом Add CRUD Methods
В delete-процедуре,перед удалением из основной таблицы, генерируется сценарий удаления из всех связанных таблиц.
Процедуру можно засунуть в курсор, в котором пройтись по записям которые нужно удалить

-- =============================================
--
-- 	dbo.CompanyEmployee_del
--
--	Delete method.
--
-- 	Date: 18.09.2013, Admin
--
-- =============================================
ALTER PROCEDURE dbo.CompanyEmployee_del @CompanyEmployeeId INT
AS
BEGIN
	SET NOCOUNT ON
	SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

	/* uncomment if needed
		delete from dbo.Parent where CompanyEmployeeId = ?
	delete from rct.PositionHiringStatus where AuthorId = ?
	delete from rct.CompensationAndBenefit where CompanyEmployeeId = ?
	delete from rct.Reader where CompanyEmployeeId = ?
	delete from rct.PositionHiringStatusHistory where AuthorId = ?
	...
	...
	delete from rct.CandidateMark where AuthorId = ?
	delete from dbo.ProbationEstimationSheet where EstimatorId = ?
	delete from hash.CompanyEmployeeDepartment where CompanyEmployeeId = ?
 
	*/
	DELETE
	FROM dbo.CompanyEmployee
	WHERE CompanyEmployeeId = @CompanyEmployeeId

	RETURN 0
END
18 сен 13, 11:03    [14852954]     Ответить | Цитировать Сообщить модератору
 Re: Удаление записей со многих таблиц  [new]
Гость333
Member

Откуда:
Сообщений: 3683
SQL Refactor Studio Team
Процедуру можно засунуть в курсор, в котором пройтись по записям которые нужно удалить

это печально

SQL Refactor Studio Team
	SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

это тоже печально
18 сен 13, 11:11    [14853016]     Ответить | Цитировать Сообщить модератору
 Re: Удаление записей со многих таблиц  [new]
SQL Refactor Studio Team
Member

Откуда:
Сообщений: 84
Гость333
SQL Refactor Studio Team
Процедуру можно засунуть в курсор, в котором пройтись по записям которые нужно удалить

это печально

SQL Refactor Studio Team
	SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

это тоже печально


Шаблоны процедур легко настраиваются. Можно поменять все что угодно, добавить транзакции, обработку ошибок и т.д.
Курсор, как один из вариантов пакетного удаления. Если задача одноразовая и записей мало -то почему нет?
Можно еще в процедуру вместо ID передать табличную переменную, строку из ID, xml в конце концов.
18 сен 13, 11:22    [14853115]     Ответить | Цитировать Сообщить модератору
 Re: Удаление записей со многих таблиц  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 2414
SQL Refactor Studio Team
записей мало -то почему нет?
.

сегодня мало, завтра много, если есть возможность не использовать курсор, то не нужно его использовать
18 сен 13, 11:37    [14853259]     Ответить | Цитировать Сообщить модератору
 Re: Удаление записей со многих таблиц  [new]
SQL Refactor Studio Team
Member

Откуда:
Сообщений: 84
StarikNavy
SQL Refactor Studio Team
записей мало -то почему нет?
.

сегодня мало, завтра много, если есть возможность не использовать курсор, то не нужно его использовать


ключевую фразу "одноразовая задача" упустили :)
18 сен 13, 11:48    [14853349]     Ответить | Цитировать Сообщить модератору
 Re: Удаление записей со многих таблиц  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
SQL Refactor Studio Team
ключевую фразу "одноразовая задача" упустили :)

уж тем более курсору тут делать нечего,ответ был сразу в первом посте 14852109
18 сен 13, 11:49    [14853364]     Ответить | Цитировать Сообщить модератору
 Re: Удаление записей со многих таблиц  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
FOREIGN KEY ON DELETE CASCADE почему не подходит?
18 сен 13, 13:28    [14854125]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить