SQL:将数据从源表复制到目标表后,更新源表中的值(来自目标表)

时间:2013-06-19 10:36:16

标签: sql sql-server

我所拥有的表格;

TableA {TableA_OID, TableB_OID, SomeFields} //Source Table

TableB{TableB_OID, SomeFields} //Destination Table

我必须将一些数据从源表复制到目标表,并且在成功时我想将目标表的主键标识字段(TableB_OID)恢复为更新(TableB_OID)字段源表。

3 个答案:

答案 0 :(得分:1)

我认为以下内容可行,但我首先要使用一些合理大小的数据集来确定:

DECLARE @TA TABLE (ID INT IDENTITY(1,1), AID INT)
INSERT @TA(AID) SELECT TableA_OID FROM TABLEA  -- ORDER BY data desc 
DECLARE @TB TABLE (ID INT IDENTITY(1,1), BID INT)

INSERT TableB( data )
OUTPUT Inserted.TableB_OID INTO @TB(BID)
SELECT data 
FROM @TA TA JOIN TableA ON TA.AID=TableA.TableA_OID ORDER BY TA.ID

SELECT * FROM @TA
SELECT * FROM @TB

UPDATE TableA 
SET TableB_OID=TB.BID
FROM @TB TB 
    JOIN @TA TA ON TB.ID=TA.ID
    JOIN TableA ON TA.AID=TableA.TableA_OID

SELECT * FROM TableA
SELECT * FROM TableB

首先,我们将对从表A中提取的数据强制执行订单,并使用临时表中的标识列来记录该订单,并链接到原始表A记录。然后,我们将使用该顺序将数据插入表B,并将结果输出记录到另一个临时表中。同样,我们将使用标识来记录序列。然后,我们将使用两个临时表中的标识值来链接tableA和tableB行

答案 1 :(得分:0)

我想你想选择scope_identity()

这将执行一行:

    INSERT INTO TableB (
        something
    )
    VALUES (
        'Some Value'
    )

    DECLARE @Id int
    SET @Id = scope_identity()

    UPDATE TableA SET tableB_OID = @Id WHERE TableA_OID = TableAId

答案 2 :(得分:0)

如果您需要一次复制多行,可以使用以下内容:

DECLARE @data TABLE(ID int, data varchar(50))

INSERT TableB( data )
OUTPUT Inserted.TableB_OID, INSERTed.data INTO @data
SELECT data FROM TableA 


UPDATE TableA 
SET TableB_OID=D.ID
FROM @data D JOIN TableA ON D.DATA=TableA.data

虽然它确实假设在我的示例中“SomeField”(列“data”)中有一个唯一键,否则您无法将身份数据关联回tableA。如果有,那么很好,否则,正如Steph所说,你需要在TableB中添加一个TableA_OID字段才能进行连接以写回数据