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

时间:2015-08-20 18:30:11

标签: sql sql-server sql-update sql-insert insert-update

可能已经有答案,但我找不到它......所以我在第三个表中有2个表和数据。让它们命名(Source,Target和UpdateTarget)。

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

  

无法绑定多部分标识符“s.EmployeeID”。

这是我当前的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

目标表中没有EmployeeID列。

有没有办法实现它而不对每条记录进行两次查询?或者你可以指出我现有的答案吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

1)INSERT INTO表变量生成的id,以及EmployeeId用于更新

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

3)OUTPUT结果,插入操作,从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