Sql-Server

我可以在 INSERT 中使用 UPDATE 中的 OUTPUT 嗎?

  • February 28, 2020

我想在我的應用程序的“SystemSettings”表中添加一條記錄,並使用 UPDATE 中的值設置 PK 值。PK 值來自“TS_LASTIDS”表,該表包含此應用程序中每個表的最大 PK 值(MicroFocus SBM)。在將新記錄插入“SystemSettings”表時,我需要增加該表中的“TS_LASTID”列並使用新值作為 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。

添加INTO解決了部分問題。

訣竅是將INSERT操作“移入”OUTPUT INTO子句。是“暗示的INSERT”,我認為是OUTPUT INTO因為INSERT. 這只有效,因為我想INSERT用新的 ID 做一個——如果我想做一個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值;用該值更新一個表,並在INSERT;中使用新值 全部在 1 個原子語句中。

文件:將從 OUTPUT 子句返回的數據插入表中

這是使用 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

引用自:https://dba.stackexchange.com/questions/260645