web-dev-qa-db-ja.com

INSERTでUPDATEからのOUTPUTを使用できますか?

アプリの「SystemSettings」テーブルにレコードを追加し、UPDATEからの値を使用してPK値を設定したいと思います。 PK値は、このアプリケーション(MicroFocus SBM)の各テーブルの最大PK値を含む「TS_LASTIDS」テーブルから取得されます。そのテーブルの「TS_LASTID」列をインクリメントし、「SystemSettings」テーブルに新しいレコードを挿入するときに、新しい値をPKとして使用する必要があります。

Insert Into
   ts_SystemSettings ( ts_Id, ts_Name, ts_LongValue)

Values (
   ( -- ******************** This subquery updates the PK in TS_LASTIDS and outputs the new value
      Update
         ts_LastIds
      Set
         ts_LastId=ts_LastId+1
      Output
         INSERTED.ts_LastId
      Where
         ts_Name = 'SystemSettings'
   ) ,  -- ******************** 
   'NSLastChangeId' ,
   1 ,
) ;

構文がわかりません。これは、MS SQLサーバー2012です。

2
mnemotronic

INTOを追加すると、問題の一部が解決されます。

コツは、INSERT操作をOUTPUT INTO句に「移動」することです。 INSERTは「暗黙的」です。OUTPUT INTOINSERTを実行するためです。これは、新しいIDでINSERTを実行したいためにのみ機能します。UPDATEを実行したい場合、これは機能しません。

Update
   ts_LastIds
Set
   ts_LastId=ts_LastId+1
Output 
   INSERTED.ts_LastId ,
   'NSLastChangeId' ,
   1
Into ts_SystemSettings ( ts_Id, ts_Name, ts_DataType, ts_LongValue )
Where
   ts_Name = 'SystemSettings' ;

だから、あなたはそれを持っています。新しいPK値を計算します。その値で1つのテーブルを更新し、INSERTで新しい値を使用します。すべて1つのアトミックステートメント。

ドキュメント: OUTPUT句から返されたデータをテーブルに挿入する

1
mnemotronic

これはOUTPUT ... INTOの使用例です

--demo setup
drop table if exists InsertTest;
Create Table InsertTest (id int);

drop table if exists UpdateTest;
Create Table UpdateTest (id int);
insert into UpdateTest(id) values(1),(2);

--solution
UPDATE UpdateTest
SET id = id + 1
OUTPUT INSERTED.id
INTO InsertTest;

--verify results of insert
select * from InsertTest

ID
2
3
6
Scott Hodgin