从select插入同一表,并将新旧标识值存储在单独的表中

时间:2018-08-02 16:45:18

标签: sql sql-server identity

临时表:

target_compile_options ( <lib> PUBLIC -m32 )
set_target_properties ( <target> PROPERTIES LINK_FLAGS -m32 )
target_link_libraries ( <target> PRIVATE <lib> )

数据库表:declare @Temp_Table table ( newSID int, oldSID int )

Solutions

插入后,

Solutions:

* 1   solution1  111
* 2   solution2  111
* 3   solution3  111

预期的温度表

* 1   solution1  111
* 2   solution2  111
* 3   solution3  111
* 4   solution1  222
* 5   solution2  222
* 6   solution3  222

此表具有 oldsID NewSID * 1 4 * 2 5 * 3 6 (身份),SID和cnumber。

现在,我想从SName表中选择一些行,并将其值插入同一表中。

插入每一行时,我想将旧标识值和新标识值存储在临时表(Solutions)中。

请帮助我。

1 个答案:

答案 0 :(得分:1)

诀窍是使用merge而不是常规的insert into..select,因为使用merge可以在output子句中使用源和目标中的数据。

首先,创建并填充示例表(在您将来的问题中为我们保存此步骤):

CREATE TABLE Solutions
(
    SolutionID int identity (1,1), 
    SolutionName varchar(10), 
    ClientNumber int
)

INSERT INTO Solutions (SolutionName, ClientNumber) VALUES
('solution1', 111),
('solution2', 111),
('solution3', 111)

然后,声明映射表:

DECLARE @Temp_MasterSolutionsTable AS TABLE
(
    newSolutionID int,
    oldSolutionID int
)

下一步,复制所需的记录:

MERGE INTO Solutions USING
(
    SELECT SolutionID, SolutionName, ClientNumber
    FROM Solutions
    --WHERE CONDITION -- I'm guessing you will need a where clause here
) AS s ON 1 = 0 -- Always not matched
WHEN NOT MATCHED THEN
INSERT (SolutionName, ClientNumber)
VALUES (s.SolutionName, s.ClientNumber)
-- and here is where the magic happens
OUTPUT Inserted.SolutionID, s.SolutionID
INTO @Temp_MasterSolutionsTable (newSolutionID, oldSolutionID); 

See a live demo on rextester.