2016-11-20 2 views
0

У меня возникли трудности с выяснением правильного способа управления следующим сценарием.Обновление TSQL/удаление из JunctionTable

У меня есть 3 таблица категорий, каталог, Junction

Я использую таблицу Junction для многих ко многим отношений между моей Категорией & риэлтор таблицами, так как любая данная запись в моей таблице листинга может быть назначена- или многие категории из таблицы «Категории».

Я выяснил, как правильно вставить INSERT в оба. Теперь мое затруднительное положение - Обновление.

Если пользователь хочет обновить свои списки в новых категориях, тогда мой код должен удалить любые существующие записи в JunctionTable и заменить их новыми. Как я могу написать инструкцию SQL, которая это выполнила?

Это мои два оператора вставки, которые срабатывают, когда я добавляю листинг.

INSERT INTO BND_Listing_testing 
(Company,Doors,Address,Address2,City,Region,Country,PostalCode,Lat,Long,Phone,Fax,Website,Description,Actualized,Verified,IMG1,IMG2,IMG3,IMG4,DateAdded) 
VALUES 
('[Company]','[Doors]','[Address]','[Address2]','[City]','[Region]','[Country]','[PostalCode]','[Lat]','[Long]','[Phone]','[Fax]','[Website]','[Description]','[Actualized]','[Verified]','[Image1]','[Image2]','[Image3]','[Image4]','[DateAdded]') 

select scope_identity() 

Я хранение идентичности вышеупомянутого запроса в маркере [ScopedLID] для следующего запроса

DECLARE @CatIDStr VARCHAR(100) = '[CatID]',@CatID VARCHAR(100) = '' 

WHILE LEN(@CatIDStr) > 0 
BEGIN 

    IF CHARINDEX(',',@CatIDStr) = 0 
    BEGIN 
     SET @CatID = @CatIDStr 
     SET @CatIDStr = '' 
    END 
    ELSE 
    BEGIN 
    SELECT @CatID = SUBSTRING(@CatIDStr,0,CHARINDEX(',',@CatIDStr))           
    SELECT @CatIDStr=SUBSTRING(@CatIDStr,CHARINDEX(',',@CatIDStr)+1,LEN(@CatIDStr)) 
    END 

    INSERT INTO BND_ListingJunction_testing (Junc_LID,Junc_CatID) 
    Values ('[ScopedLID]',@CatID) 

END 
+1

Использовать триггер? https://msdn.microsoft.com/en-us/library/ms178110.aspx – DVT

+0

@DVT Спасибо за предложение, я прочитаю эту страницу. – UserSN

ответ

2

Использование транзакции. Внутри этой транзакции сначала удалите все строки из таблицы соединений для указанного листинга, а затем добавьте новые строки для выбранных комбинаций листинга и категории.

+0

@rd_neilsen у вас будет страница с примером, где я мог бы посмотреть? – UserSN

+1

У меня нет примера под рукой, который имеет прямое отношение к вашему коду, но на самом деле все, что вам нужно сделать, это добавить команду удаления между кодом в ваших двух блоках выше: «удалить из BND_ListingJunction_testing, где Junc_LID = ScopedLID;» Объединение этой инструкции удаления и кода для вставки данных в таблицу соединений в транзакции - это просто защита от потери данных. –

Смежные вопросы