1

SQL Server 2008 を使用しています。これがサンプル テーブルです。

 SEQ   NAME  GROUP
  1    abc   1
  2    bcd   1
  3    cde   3

上記の表で、SEQ は私の ID 列 (自動番号) です。name = 'def' および group = 3 の新しい行を挿入したい場合は、次のように実行できます。

INSERT INTO SampleTable(NAME, GROUP) VALUES ('def',3)

ここで、新しい行を挿入してから、新しく挿入された行の GROUP = SEQ を設定する場合、以下に示すように 2 つの手順で実行しています。

INSERT INTO SampleTable(NAME, GROUP) VALUES ('def',999)
UPDATE SampleTable SET GROUP = SEQ where NAME = 'def'

ワンステップでそれを行う方法はありますか?例えば

INSERT INTO SampleTable(NAME, GROUP) VALUES ('def',SCOPE_IDENTITY())

挿入が完了した後にのみ SCOPE_IDENTITY() が設定されるため、上記のステートメントは明らかに機能しません。しかし、単一の挿入ステートメントを使用して GROUP = SEQ を設定する方法はありますか?

4

2 に答える 2

0

マイナーな改善は、UPDATEを filter on に変更することSEQです:

INSERT INTO SampleTable(NAME, GROUP) VALUES ('def',999)
UPDATE SampleTable SET GROUP = SEQ where SEQ = SCOPE_IDENTITY()

でフィルタリングすることにより、クラスタ化されたインデックスのシークを取得する可能性が高いため、私はこれの方が気に入っていますSEQ。また、意味的にもきれいだと思います。

IDENTITY列を使用した 1 つのステートメントでこれを行う方法はわかりません(考えてOUTPUTMERGE何も思い浮かびません)。構文SEQUENCEを使用して、SQL Server 2012 でも実行できます。INSERT...SELECT選択部分では、シーケンスから 1 つの数字を取り出し、それを 2 つの列にコピーします。

于 2013-05-06T17:59:31.317 に答える