私はC#を使用しており、SqlBulkCopyを使用しています。でも問題があります。あるテーブルに一括挿入してから、別のテーブルに別の一括挿入を行う必要があります。
これら2つにはPK/FKの関係があります。
Table A
Field1 -PK auto incrementing (easy to do SqlBulkCopy as straight forward)
Table B
Field1 -PK/FK - This field makes the relationship and is also the PK of this table. It is not auto incrementing and needs to have the same id as to the row in Table A.
したがって、これらのテーブルには1対1の関係がありますが、テーブルBに必要なため、マスインサートが作成したすべてのPKIDを取得する方法がわかりません。
編集
私はこのようなことをすることができますか?
SELECT *
FROM Product
WHERE NOT EXISTS (SELECT * FROM ProductReview WHERE Product.ProductId = ProductReview.ProductId AND Product.Qty = NULL AND Product.ProductName != 'Ipad')
これにより、SQLバルクコピーで挿入されたすべての行が検索されます。これから結果を取得し、SPからそれらを使用して一括挿入を実行する方法がわかりません。
これで私が見ることができる唯一の問題は、ユーザーが一度に1つずつレコードを実行していて、このステートメントが同時に実行される場合、「製品レビューテーブル」に行を2回挿入しようとする可能性があることです。
つまり、あるユーザーが手動の方法を使用し、別のユーザーがほぼ同時に大量の方法を使用するようになったとします。
手動の方法。 1.ユーザーがデータを送信します2.Linqto sql製品オブジェクトが作成され、データが入力されて送信されます。3.このオブジェクトにはProductIdが含まれています。4。製品レビューテーブル用に別のlinqtosqlオブジェクトが作成され、挿入されます(手順3の製品IDが一緒に送信されます)。
マスウェイ。 1.ユーザーは、データを共有しているユーザーからデータを取得します。2.共有ユーザーからのすべてのProduct行が取得されます。3.製品行へのSQL一括コピー挿入が発生します。4.私のSPは、Productテーブルにのみ存在し、他のいくつかの条件を満たすすべての行を選択します。5.一括挿入はそれらの行で発生します。
したがって、ステップ3(手動の方法)がステップ4(大量の方法)と同時に発生している場合はどうなりますか。同じ行を2回挿入しようとすると、プライマリ制約が実行されると思います。