【问题标题】:Insert into select, use inserted Id to update column in selected table插入选择,使用插入的 Id 更新选定表中的列
【发布时间】:2021-11-22 03:54:40
【问题描述】:

我正在尝试将数据从表 A 复制到表 B,然后将表 A 中的更新 FK 列插入到新插入的表 B Id。因为这些需要相关。

INSERT INTO TableB(ColA, ColB, ColC, ColD, ...) 
SELECT a.ColA, a.ColB, a.ColC, a.ColD, ...
FROM TableA a for update;
update a set TableBId = (newly inserted id from table B)

在代码中以便更好地理解

        foreach (var tableA in AllTableA)
        {
            TableB newB = new TableB(tableA);
            AllTableB.Add(newB);
            tableA.TableBId = newB.GetId();
        }

我怎样才能在一笔交易中做到这一点?

【问题讨论】:

  • 这能回答你的问题吗? Get the last inserted row ID (with SQL statement) 使用 SCOPE_IDENTITY()。或者对于多行,使用OUTPUT 子句
  • for update 在 SQL Server 中无效。必要时可以使用WITH (UPDLOCK)
  • @Charlieface 否,因为我想从选择的每个插入表单中获取每个 Id,并从选择的每个插入中更新每个 Id,而不会丢失它们之间的关系。对于选择的每一行,我想与从所选行获取值的插入行创建一个关系。
  • 在临时表或表变量中使用OUTPUT 子句,另见stackoverflow.com/questions/5228780/how-to-get-last-inserted-id
  • 是的,我明白这一点,但我从 600 个选定值中插入了 600 行,而不会失去彼此之间的连接。我可以通过一个简单的插入轻松地做到这一点,但我无法让它与带有 OUTPUT 的插入一起工作到选择和更新中,对于每一行。

标签: sql sql-server insert sql-update


【解决方案1】:

我解决了:

我在表 A 中添加了一个临时 ID 列,在插入过程中,我给了它来自 tableB Id 的值。

然后我从 tableA 中找到 Id 的位置更新了 TableB.FK。

然后删除该列。

INSERT INTO TableA(values..., tableBId)
SELECT Values..., Id
FROM TableB

Update TableB SET TableAId = tableA.Id
FROM TableB
INNER JOIN TableA ON(Tablea.TableBId = TableB.Id)

ALTER TABLE TableA
DROP COLUMN TableBId;

也许不是最好的方法,但它确实有效。

【讨论】:

    猜你喜欢
    • 2011-08-04
    • 1970-01-01
    • 2017-06-22
    • 1970-01-01
    • 2018-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多