2012-03-24 32 views
1

複数のレベルの親子テーブル(GrandParent、親と子、多対1リレーション、1つの親に複数の子があり、すべての子に1つの親があります)があります。それぞれに自動識別キーがあります。 C#とストアドプロシージャを使用して、どのように外部キー制約でそれらを挿入するのですか? たとえば、挿入するデータには複数の祖父母が含まれ、各父母には複数の親と各親の複数の子があります。SQLサーバーで親子テーブルに挿入

サンプルデータ:いくつかのキャンパスと関連する建物/オフィスの追加

campus <- building <- office 

+0

挿入するアイテムは、あなたのシステムに*前の*どのような形で挿入されますか?彼らはどうつながっているのですか? SPへの1回の呼び出しで*すべての*アイテムを渡す方法があった場合、名前やその他のプロパティとともにリンク(仮のIDなど)を渡すことができますか? –

答えて

3

:あなたはこのような何か(擬似コード)を行うことができます

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, ...) 

はあなたが何を意味するか、このです?

EDIT

あなたが実際にテーブル値パラメータを使用して、ADO.NETとSQL Server 2008で、一度にすべてのデータを渡すことができます。

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

あなたの親に渡すことができ

および子データをストアドプロシージャの2つのテーブルとして使用し、カーソルをループして親をループし、挿入し、生成されたIDを取得してから、すべての子を挿入して次の親に進みます。

これはたぶんデータベースへの単一の呼び出しを必要とする可能性が最も高いソリューションであり、挿入するデータ量が多い場合や、このSPを他の場所で再利用できると思われる場合、これは行く方法かもしれません。

しかし、私は、クライアントアプリケーションからレコードを1つずつ挿入する方がクリーンで、確かにあなたが望むものを達成する簡単な方法だと思います。

+0

MyParentに複数のエントリを挿入すると、Idのリストが得られます。各IDの正しい子にどのようにリンクすればよいですか? – Icerman

+0

各挿入の後、上記の手法を使用して生成されたIDをC#に格納し、子を挿入するときに参照することができます。 –

+0

意味があります。しかし、私はudtt(s)を使用して1つのsprocにセット全体を挿入できるかどうか疑問に思っていました。 – Icerman

1

ここに本当に必要なのはdatabase triggerだと思います。制約内のダイレクト・テーブル参照整合性を除いて、カスタム・ロジックを強制することはできません。カスタムロジック(2つの親などが必要)が必要な場合は、データベーストリガーを使用する必要があります。あなたが最後に挿入された自動インクリメントIDを取得するためにSCOPE_IDENTITY()機能を使用することができます

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

私の質問を明確にするために質問が更新されました。 – Icerman

関連する問題