質問: NULL AND Product.ProductName != 'Ipad') ``` これは、SQLの一括コピーで挿入されたばかりの行をすべて検索します。私はどのようにこの結果を取るかわからないし、SPからそれらと一緒に大量挿入を行う。 私が見ることができる唯一の問題は、ユーザーがレコードを一度に1つずつ実行しているときに、このステートメントが同時に実行されて、「製品レビュー表」に行を2回挿入しようとする可能性があることです。 だから私は手動の方法を使って1人のユーザーとほぼ同じ時間に大量のやり方をしている別のユーザーのようになったと言う。 **手動で** 1.ユーザがデータを提出する2. Linq to sql Productオブジェクトが作成され、データで満たされ、提出されます。 3.このオブジェクトにProductId 4が含まれるようになりました。もう1つのlinq to sqlオブジェクトがProductレビューテーブル用に作成され、挿入されます(手順3のProduct Idが送信されます)。 **大量の方法。**ユーザは、データを共有するユーザからデータを取得する。 2.共有ユーザーのすべての製品行が取得されます。 3. Product行のSQL Bulk copy insertが実行されます。 4.私のSPは、Productテーブルにのみ存在し、他のいくつかの条件を満たすすべての行を選択します。5.一括挿入は、これらの行で行われます。 それで、ステップ3(手作業)がステップ4(マス・ウェイ)と同時に起こっているとどうなりますか?私は、同じ行を二度挿入しようとすると、一次制約の実行を引き起こすと思います。
回答: このシナリオでは、 `SqlBulkCopy`を使用して**ステージング**テーブルに挿入します(インポートするデータのように見えますが、メインのトランザクションテーブルの一部ではありません)。次に`INSERT` / `SELECT`データを最初の実表に移動します。 今は、サーバーのバージョンによって2つの選択肢があります。 2番目の実テーブルへの2番目の`INSERT` / `SELECT`を実行するか、2番目の`INSERT` / `OUTPUT`句を使用してテーブルのID行を使用します。 例えば: ``` -- dummy schema CREATE TABLE TMP (data varchar(max)) CREATE TABLE [Table1] (id int not null identity(1,1), data varchar(max)) CREATE TABLE [Table2] (id int not null identity(1,1), id1 int not null, data varchar(max)) -- imagine this is the SqlBulkCopy INSERT TMP VALUES('abc') INSERT TMP VALUES('def') INSERT TMP VALUES('ghi') -- now push into the real tables INSERT [Table1] OUTPUT INSERTED.id, INSERTED.data INTO Table2 SELECT data FROM TMP ```