2015-07-07 2 views
1

Я пытаюсь записать хранимую процедуру, которая удаляет связанные записи. Если вы посмотрите на изображение ниже, вы увидите, как на стенде есть тип стенда и зал, а тип стенда - productid, который затем содержится в таблице продуктов.Удалить связанные записи

По существу, я пытаюсь удалить зал, а это значит также удаление стенда, типа стенда и продукта для типа стенда.

Я даже не знаю, с чего начать, поскольку я очень новичок в sql, поэтому любые рекомендации или ссылки оцениваются.

enter image description here

+2

Вы можете установить внешний ключ для каскадного удаления, если вы хотите быть ленивым, но вы всегда должны быть осторожны при удалении данных – br4d

+0

@ br4d, да все они имеют contraint FK но который не установлен, и я не хочу его устанавливать. Перед удалением пользователя отображается большое предупреждение. Я мог бы сделать это вручную на C#, но я хочу написать SP, поскольку я чувствую, что он будет намного эффективнее. – cb1295

ответ

2

Если у вас есть каскад для удалять настройки на вашем столе DDL затем, если youdelete на родительской таблицы удаления будет каскадные таблицы ребенка и их дети recursiveley.

подробнее: http://www.techonthenet.com/sql_server/foreign_keys/foreign_delete.php

Чтобы manaully удалить из каждой таблицы нужно удалить из наименее в зависимости от большинства в зависимости таблицы, удаление от ребенка до родителей, с помощью объединений, чтобы помочь.

+0

Это имеет смысл, я думаю, мой вопрос: как мне собрать данные и сохранить их, чтобы добраться до этих дочерних элементов из родительские элементы. Мне нужно было бы получить все кабинки, у которых HallId будет равным id, переданному в параметре. а затем для каждого из этих стендов перейдите к его типу стенда, найдите продукт для него, затем цену для этого продукта и, наконец, цену, разделенную на эту цену, и начните ее удалять. – cb1295

+1

Держите его простым и используйте DELETE FROM с соединениями. delete pricesplit from pricesplit внутренняя цена присоединения (материал = материал) внутренний продукт присоединения (материал = материал) и т. д. – TheMadDBA

0

Итак, я закончил использование объединений и УДАЛИТЬ ОТ, как предложил @TheMadDBA, так что он поддерживает его для этой идеи. Начало работы с чтобы в зависимости от наиболее зависимости

USE [DB] 
GO 
/****** Object: StoredProcedure [Exhibit].[DeleteHallAndRelatedData] Script Date: 7/7/2015 2:30:42 PM ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 


---------------------- DeleteHallAndRelatedData ---------------------------------------------------------------------------- 
ALTER PROC [Exhibit].[DeleteHallAndRelatedData] 
    @OwnerId UniqueIdentifier, 
    @HallId UniqueIdentifier  
AS 
----------------------------------------------------------------------------------------------------- 
SET NOCOUNT ON 

Print N'DELETING PRICE SPLITS' 

delete spl from 
Shopping.PriceSplit spl 
join Shopping.Price prc on prc.id=spl.priceId 
join Shopping.Product prd on prd.Id = prc.ProductId 
join Exhibit.BoothType bt on bt.BoothTypeProductId=prd.Id 
Join Exhibit.Booth b on b.BoothTypeId=bt.BoothTypeProductId 
where 
b.HallId= @HallId and b.OwnerId = @OwnerId 

Print N'DELETING PRICES' 
delete prc from 
Shopping.Price prc 
join Shopping.Product prd on prd.Id = prc.ProductId 
join Exhibit.BoothType bt on bt.BoothTypeProductId=prd.Id 
Join Exhibit.Booth b on b.BoothTypeId=bt.BoothTypeProductId 
where 
b.HallId= @HallId and b.OwnerId = @OwnerId 

Print N'DELETING PRODUCTS' 
delete prd from 
Shopping.Product prd 
join Exhibit.BoothType bt on bt.BoothTypeProductId=prd.Id 
Join Exhibit.Booth b on b.BoothTypeId=bt.BoothTypeProductId 
where 
b.HallId= @HallId and b.OwnerId = @OwnerId 

Print N'DELETING BOOTH TYPES' 
delete bt from 
Exhibit.BoothType bt 
Join Exhibit.Booth b on b.BoothTypeId=bt.BoothTypeProductId 
where 
b.HallId= @HallId and b.OwnerId = @OwnerId 

Print N'DELETING BOOTHS' 
delete from Exhibit.Booth where HallId = @HallId 

Print N'DELETING HALL' 
delete from Exhibit.Hall where Id = @HallId 
Смежные вопросы