可能已经有答案了,但我找不到它......所以我有 2 个表和第三个表中的数据。让我们为它们命名(源、目标和更新目标)。
我需要将记录从源插入到目标,然后从目标获取自动增量 ID,并根据源表中的过滤器使用这些 ID 更新 UpdateTarget 表。我尝试使用 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
我的目标表中没有 EmployeeID 列。
有没有办法在不为每条记录进行两次查询的情况下实现它?或者您能否指出现有的答案(如果有)?
谢谢!
最佳答案
1) INSERT INTO 表变量生成的 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);;
关于sql - 根据插入的 ID 和 SQL 中的另一个非源列更新记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32125738/