2

テーブルのサブセットを同じテーブルに挿入しています。一部のマッピング テーブルにレコードを作成するには、新しく作成された ID PK と一致する古い PK の両方を取得する必要があります。

SQL がそれをサポートする場合、次のようになります。

Create table Test (pk identity, description varchar(10))

Declare @PKVALUES TABLE (NewPK int, OLdPk int)

INSERT INTO Test (description)
OUTPUT INSERTED.PK, Test.PK into @PKVALUES
Select description
From Test
Where ...

しかしもちろん、SQL は INSERT 操作中の FROM テーブルからの値の出力をサポートしていません。

私が遭遇した唯一のセットベースの代替手段は、一時テーブルに新しい PK を作成し、ID 挿入を使用してそれらを Test テーブルに挿入するときに、テーブル全体をロックする必要があります。

これを達成する方法はありますか (一度に 1 つのレコードに頼ったり、テーブル全体をロックしたりする必要はありません)。

ありがとう、イルマー

4

1 に答える 1

1

私の好みは、古い pk を格納するための列を追加し、それを出力句から返すことです。ただし、常にテーブルを変更できるとは限りません。

だから、私は卑劣なトリックを持っていますが、データベースで2倍の作業を行う必要があります. あなたがすることは、最初の挿入の説明フィールドに古い PK を入れることです。次に、説明フィールドを PK に結合して、説明を古い PK の値に更新します。

Create table Test (pk identity, description varchar(10))  

Declare @PKVALUES TABLE (NewPK int, OLdPk varchar(10)  

INSERT INTO Test (description) 
OUTPUT INSERTED.PK, INSERTED.Description into @PKVALUES
SELECT PK from Test where....

UPDATE tnew
SET description = told.description
FROM test told
JOIN test tnew ON CAST(told.PK AS varchar (10)) = t.description 
于 2012-06-13T21:07:28.917 に答える