2016-11-20 3 views
0

Ich habe Schwierigkeiten herauszufinden, den richtigen Weg, um das folgende Szenario zu verwalten.TSQL Aktualisierung/Löschen von JunctionTable

Ich habe 3 Tabellen Kategorien, Auflisten Junction

Ich bin mit der Junction-Tabelle für viele-zu-viele Beziehungen zwischen meinen Kategorien & Eintrag Tabellen, wie jeder gegebenen Datensatz in meinem Eintrag Tabelle kann 1 zugeordnet werden oder viele Kategorien aus der Kategorien-Tabelle.

Ich habe herausgefunden, wie Sie richtig in beide einfügen. Jetzt ist mein Dilemma Update.

Wenn ein Benutzer seine Auflistung in neue Kategorien aktualisieren möchte, muss mein Code alle vorhandenen Datensätze in der JunctionTable löschen und durch neue ersetzen. Wie kann ich eine SQL-Anweisung schreiben, die das leistet?

Dies sind meine beiden INSERT-Anweisungen, die ausgelöst werden, wenn ich einen Eintrag hinzufüge.

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() 

Ich bin Speichern der Identität der obigen Abfrage in einem Token [ScopedLID] für die folgende Abfrage

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

Trigger verwenden? https://msdn.microsoft.com/en-us/library/ms178110.aspx – DVT

+0

@DVT Danke für den Vorschlag, ich werde diese Seite lesen. – UserSN

Antwort

2

Verwenden Sie eine Transaktion. Löschen Sie innerhalb dieser Transaktion zuerst alle Zeilen aus der Junction-Tabelle für die angegebene Auflistung und fügen Sie anschließend neue Zeilen für die ausgewählten Kombinationen aus Liste und Kategorie hinzu.

+0

@rd_neilsen würdest du zufällig eine Seite mit einem Beispiel haben, das ich mir anschauen könnte? – UserSN

+1

Ich habe kein Beispiel zur Hand, das direkt zu Ihrem Code gehört, aber wirklich alles, was Sie tun sollten, ist einen Löschbefehl zwischen den Code in Ihren zwei Blöcken oben hinzufügen: "Löschen von BND_ListingJunction_testing, wo Junc_LID = ScopedLID;" Das Einschließen dieser Löschanweisung und Ihres Codes zum Einfügen von Daten in die Junction-Tabelle in einer Transaktion ist nur ein Schutz vor Datenverlust. –