我所拥有的表格;
TableA {TableA_OID, TableB_OID, SomeFields} //Source Table
TableB{TableB_OID, SomeFields} //Destination Table
我必须将一些数据从源表复制到目标表,并且在成功时我想将目标表的主键标识字段(TableB_OID
)恢复为更新(TableB_OID
)字段源表。
答案 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字段才能进行连接以写回数据