0

同じサーバー上の別のテーブルを更新する保留中のデータを保持するテーブルがあります。この保留中のテーブルは、別のサーバーのストアドプロシージャからデータを取得します。データがこの保留中のテーブルに入ると、ストアドプロシージャは、保留中のテーブルのtinyint列に基づいて、挿入、更新、または削除を試みます。

この保留中のテーブルは、何かが発生する必要がない限り、空のままになります。手順の最後に、この保留中のテーブルから削除します。

プロシージャの実行中に、更新が必要な同じレコードが他のサーバーから2回挿入された場合にどうなるかという問題が発生しました。最後に、両方のレコードがクリアされます。保留中のテーブルにインクリメンタルIDを追加してこれを解決しようとしましたが、挿入にIDを出力できません。

insert into config.table (col1, col2, col3)
output inserted.col3, pendingId into @table
select p.col1, p.col2, p.col3
from pendingTable p
 left join config.table t on p.col1 = t.col1
where t.col1 is null

保留中のIDでエラーが発生します。変更されていないレコード(プロシージャの実行中に追加された新しく挿入されたレコード)が削除されないように、@table変数を使用して保留中から削除する予定です。

delete p
from pendingTable p
 inner join @table t on p.pendingId = t.pendingId and p.col3 = t.col3
4

1 に答える 1

2

保留中のレコードをキャッシュし、後で削除する必要があります。

begin tran

select p.pendingid
into #pendingcache
from pendingTable p
 left join config.table t on p.col1 = t.col1
where t.col1 is null

insert into config.table (col1, col2, col3)
output inserted.col3, pendingId into @table
select ...
from #pendingcache

delete p
from pendingTable p
inner join #pendingcache c on c.pendingId = p.pendingId

commit


以下の元の回答

あなたはinserted前に行方不明ですpendingid、すなわちinserted.pendingidinsertedとの間の曖昧さを解消することdeletedです。以下の作品。

ああ、あなたもSELECTステートメント全体を見逃しているのですか、それとも実際には質問の「モック」テーブルを作成したためだと思いますか?

create table configtable (col1 int, col2 int, col3 int, pendingid int identity)

create table pendingtable (col1 int, col2 int, col3 int, pendingid int identity)
insert pendingtable values (1,2,3)

declare @table table (col3 int, pendingid int)

insert into configtable (col1, col2, col3)
output inserted.col3, inserted.pendingId into @table
select col1, col2, col3
from pendingTable p
于 2012-10-11T22:39:43.440 に答える