根据插入的 ID 和 SQL 中的另一个非源列更新记录

Update records based on inserted IDs and another non source column in SQL

可能已经有了答案,但我找不到...所以我有 2 个 table 和第三个中的数据。让我们为它们命名(源、目标和更新目标)。

我需要将记录从 Source 插入到 Target,然后从 Target 获取自动递增的 ID,并根据来自 Source table 的过滤器使用这些 ID 更新 UpdateTarget table。我尝试使用 OUTPUT,但它给了我一个错误:

The multi-part identifier "s.EmployeeID" could not be bound.

这是我当前的 SQL 查询:

CREATE TABLE dbo.target
(
    id INT IDENTITY(1,1) PRIMARY KEY,
    employee VARCHAR(32)
);

CREATE TABLE dbo.source
(
    id INT IDENTITY(1,1) PRIMARY KEY,
    employee VARCHAR(32),
    EmployeeID int
);

CREATE TABLE dbo.updateTarget
(
    id INT IDENTITY(1,1) PRIMARY KEY,
    ExternalID int
);

DECLARE @MyTableVar TABLE
(
    id INT,
    EmployeeID int
);

    INSERT dbo.target (employee)
    OUTPUT 
        inserted.id, -- autoincremented ID
        s.EmployeeID -- here i got an error
        INTO @MyTableVar
    SELECT s.employee
    FROM dbo.source AS s

    UPDATE dbo.updateTarget
    SET ExternalID = data.ID
    FROM @MyTableVar data
    WHERE updateTarget.ID = data.EmployeeID


DROP TABLE source
DROP TABLE target
DROP TABLE updateTarget

我在目标 table 中没有 EmployeeID 列。

有没有办法不用对每条记录进行两次查询就可以实现?或者,如果有的话,你能告诉我现有的答案吗?

谢谢!

1) INSERT INTO table 变量生成的 id 和 EmployeeId 用于更新

2) MERGE 而不是 INSERT(它允许从 SRC 获取列 EmployeeId)

3) 输出结果,插入操作,从 TGT 和 EmployeeId 中获取 ID

INSERT INTO @MyTableVar(id, EmployeeId)
SELECT id, EmployeeId 
FROM (
    MERGE dbo.target TGT
    USING dbo.source SRC
    ON TGT.employee = SRC.employee
    WHEN NOT MATCHED THEN
       INSERT (employee)
       VALUES (src.employee)
    OUTPUT inserted.id, SRC.EmployeeId)
AS out(id, EmployeeId);;

MERGE gives better OUTPUT options