2016-11-26 5 views
1

Ich stehe momentan vor einem Problem, und ich hätte gerne eine schnelle Lösung dafür.INSERT IN oder UPDATE bei Zustand

Ich habe bereits eine andere Antwort zu diesem Problem gefunden, aber keine hat geholfen, ich hatte gelesen über INSERT INTO und INSERT ON DUPLICATE KEY UPDATE, aber ich denke, es hilft mir nicht wirklich.

Also die Sache ist, ich habe einige Migrationen aktiviert, die neue Spalten zu bestehenden Tabellen hinzufügen, die Sache ist, dass die vorhandenen Datensätze in der Tabelle vor der Migration Datensätze mit leeren Werten sogar für vorhandene Spalten erhalten (weil ich die Reihenfolge ändern der Spalten in der neuen Tabelle migriert)

Ich mache ein SP, dass es Zweck ist, die neue migrierte Tabelle gemäß Einfügungen oder Updates zu füllen.

  • mag ich neue Datensätze immer außer im Fall einzufügen, die ich einen vorhandenen Datensatz auf dem Tisch mit leeren Spalten gefunden (Spalte Id - Primärschlüssel - gefüllt ist)

Der „Pseudo-Code“ (Misch sQL-Tabellen Wissen und C# Syntax) so etwas wie dieses würde:

int i = 0; 
foreach(Record item in importing_data_table) 
{ 

    if(i < tableMigrated.Length && tableMigrated[i].Column IS NULL) 
    { 
      UPDATE tableMigrated[i] SET Column = item.Column 
    } 
    else 
    { 
      INSERT INTO item 
    } 

    i++; 
} 

HINWEIS: Löschen Sie alle Zeilen vom tableMigrated vor Einfügen ist nicht möglich, weil es Fremdschlüssel für diese Tabelle gibt. Ich habe den folgenden Fehler beim Versuch dieses Ansatzes: - Die DELETE-Anweisung im Konflikt mit der REFERENCE-Einschränkung "FK_blabla.Testing_testingTest.tableMigrated_Id".

NOTE2: Vielleicht ist meine einzige Option die Verwendung von Cursors?

Vielen Dank für Ihre Hilfe im Voraus!

+1

Ich wusste, dass jemand diese Frage stellen würde. Ich habe diese Woche für mich selbst gelöst. Update gibt eine Ganzzahl zurück, die die Anzahl der betroffenen Zeilen angibt. Wenn Update Null zurückgibt, füge ich die Daten ein. Sie können nicht einfügen, wenn der Primärschlüsselwert bereits in der Datenbank vorhanden ist. Versuchen Sie also zuerst update und wenn es keine betroffenen Zeilen zurückgibt, verwenden Sie Einfügen. – jdweng

Antwort

1

Verwenden Sie in Ihrer Stored Procedure die Merge-Anweisung. Zusammenführen stellt die Funktionalität für INSERT basierend auf Ihrer Einfügebedingung bereit, andernfalls UPDATE. Hier ist ein Beispiel

MERGE dbo.FactBuyingHabits AS Target 
USING (SELECT CustomerID, ProductID, PurchaseDate FROM dbo.Purchases) AS Source 
ON (Target.ProductID = Source.ProductID AND Target.CustomerID = Source.CustomerID) 
WHEN MATCHED THEN 
    UPDATE SET Target.LastPurchaseDate = Source.PurchaseDate 
WHEN NOT MATCHED BY TARGET THEN 
    INSERT (CustomerID, ProductID, LastPurchaseDate) 
    VALUES (Source.CustomerID, Source.ProductID, Source.PurchaseDate) 

Werfen Sie einen Blick auf Technet - Inserting, Updating, and Deleting Data by Using MERGE

+0

Danke für deine Antwort, ich bekomme einen Fehler, kann das Problem nicht finden, manchmal macht mich SQL einfach verrückt, verdammt nochmal ... der Fehler, der meistens angezeigt wird, hilft überhaupt nicht! Hier ist mein aktueller Code, http://pastebin.com/R0uByLqv – TiagoM

+0

Finnaly hat es funktioniert, es scheint, ich brauche wirklich "Ziel" als das letzte Wort auf Merge-Anweisung (erste Zeile), ich hart, dass es sein könnte Alias ​​für die Zieldatenbank, scheint es jetzt =/ – TiagoM

+0

Eigentlich kann ich das Wort "Target" mit jedem Alias ​​für die Tabelle verwenden, mein Problem war ein Ersatz all das änderte auch "WENN NICHT GEMEINSAM ZIEL DANN" zu "WENN NICHT ABGESTIMMT VON MYTABLEALIAS DANN ", änderte MYTABLEALIAS zu TARGET es begann perfekt zu funktionieren, vielen Dank für Ihre Antwort! :) – TiagoM

Verwandte Themen