SQL BulkCopy 後に PrimaryKey ID を戻すことは可能ですか? 質問する

SQL BulkCopy 後に PrimaryKey ID を戻すことは可能ですか? 質問する

私は C# を使用しており、SqlBulkCopy を使用しています。しかし、問題があります。1 つのテーブルに一括挿入してから、別のテーブルに別の一括挿入を実行する必要があります。

これら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 に必要なため、一括挿入によって作成されたすべての PK ID を取得する方法がわかりません。

編集

こんな事もできるでしょうか?

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. Linq to sql 製品オブジェクトが作成され、データが入力されて送信されます。 3. このオブジェクトには、現在 ProductId が含まれています。 4. 製品レビュー テーブル用に別の Linq to sql オブジェクトが作成され、挿入されます (手順 3 の製品 ID が送信されます)。

マスウェイ。1. ユーザーは、データを共有しているユーザーからデータを取得します。 2. 共有ユーザーのすべての製品行が取得されます。 3. 製品行に対して SQL 一括コピー挿入が行われます。 4. SP は、製品テーブルにのみ存在し、その他の条件を満たすすべての行を選択します。 5. それらの行に対して一括挿入が行われます。

では、ステップ 3 (手動の方法) がステップ 4 (一括の方法) と同時に実行されるとどうなるでしょうか。同じ行を 2 回挿入しようとするため、プライマリ制約の例外が発生すると思います。

ベストアンサー1

SqlBulkCopyそのようなシナリオでは、演出テーブル (つまり、インポートしたいデータに似ているが、メインのトランザクション テーブルの一部ではないテーブル) を作成し、次に DB でINSERT/にSELECT移動して、データを最初の実際のテーブルに移動します。

ここで、サーバーのバージョンに応じて 2 つの選択肢があります。2 番目の実際のテーブルに 2 番目のINSERT/を実行するか、テーブルの ID 行を使用して/句を使用して 2 番目の挿入を実行するSELECTことができます。INSERTOUTPUT

例えば:

     -- 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](id1,data)
     SELECT data FROM TMP

おすすめ記事