2012-03-24 7 views
1

Ich habe mehrere Eltern-Kind-Tabellen (GrandParent, Parent und Child, alle viele zu eins Relation, ein Elternteil hat mehrere Kinder, alle Kinder haben ein Elternteil). Jeder hat Auto-Identitätsschlüssel. Verwenden von C# und gespeicherter Prozedur, wie Sie sie mit Fremdschlüsseleinschränkungen einfügen? Zum Beispiel enthalten die einzufügenden Daten mehrere Großeltern, jeder Elterngrad hat mehrere Eltern und jeder Elternteil mehrere Kinder.In Eltern-Kind-Tabellen in SQL Server einfügen

Beispieldaten:

campus <- building <- office 

einige Standorte und die damit verbundenen Gebäude/Büros Hinzufügen.

+0

In welcher Form existieren die einzufügenden Elemente in Ihrem System * vor * zum Einfügen? Wie sind sie verbunden? Wenn es eine Möglichkeit gäbe, * alle * Elemente in einem einzigen Aufruf an einen SP zu übergeben, wären Sie in der Lage, ihre Links (wie temporäre IDs) zusammen mit den Namen und anderen Eigenschaften weiterzugeben? –

Antwort

3

Sie die SCOPE_IDENTITY() Funktion können Sie die zuletzt eingefügten Autoinkrement-ID abzurufen:

DECLARE @new_parent_id INT 

INSERT INTO MyParent(...) VALUES(...) -- your new parent data 

SELECT @new_parent_id = SCOPE_IDENTITY() 

INSERT INTO MyChild(parent_id, ...) VALUES(@new_parent_id, ...) 

Ist das, was Sie meinen ?

EDIT:

http://msdn.microsoft.com/en-us/library/bb675163.aspx

Sie passieren könnten in Ihren Eltern:

Sie tatsächlich in allen Daten auf einmal mit ADO.NET und SQL Server 2008 unter Verwendung von Tabelle Wertparametern passieren können und Kinddaten als zwei Tabellen zu Ihrer gespeicherten Prozedur, dann benutzen Sie einen Cursor, um Ihre Eltern zu durchlaufen, einen einzufügen, die generierte ID zu bekommen und dann alle Kinder einzufügen, bevor Sie zum nächsten Elternteil übergehen.

Dies wäre wahrscheinlich die effizienteste Lösung, die möglicherweise nur einen einzigen Aufruf an die Datenbank erfordert und wenn Sie eine große Datenmenge einfügen müssen oder wenn Sie dieses SP an anderen Stellen in Ihrer Lösung verwenden möchten , dann könnte das der richtige Weg sein.

Ich denke jedoch, dass das Einfügen der Datensätze eins nach dem anderen aus der Client-Anwendung eine sauberere und sicherlich eine einfachere Möglichkeit, das zu erreichen, was Sie wollen.

+0

Wenn ich mehrere Einträge in MyParent einfüge, dann habe ich eine Liste von IDs, wie verknüpfe ich die richtigen Kinder für jede ID? – Icerman

+0

Nach jeder Einfügung können Sie die oben genannte Technik verwenden, um die generierte ID in C# zu speichern, auf die Sie dann zurück verweisen können, wenn Sie die untergeordneten Elemente einfügen. –

+0

Sinn machen. Aber ich habe mich gefragt, ob ich mit udtt (s) ein ganzes Set in einen Sproc einfügen kann. – Icerman

1

Ich denke, was Sie wirklich brauchen, ist hier ein database trigger. Sie können benutzerdefinierte Logik außer der direkten referenziellen Tabellenintegrität in einer Einschränkung nicht erzwingen. Wenn Sie benutzerdefinierte Logik (müssen 2 Eltern, usw.) haben, dann müssen Sie einen Datenbank-Trigger verwenden.

Sie können so etwas wie dieses (Pseudo-Code) tun:

BEFORE INSERT 
IF INSERT CAUSES MORE THAN 2 PARENTS 
    DO NOT ALLOW INSERT 
ELSE 
    ALLOW INSERT 
+0

Ich aktualisierte Frage, um meine Frage zu klären. – Icerman