OUTPUT 子句中无法识别 INSERT 表别名

OzB*_*Bob 1 sql t-sql sql-server

为什么在 OUTPUT/INSERTED 行中无法识别 INSERT 表别名?

编辑:链接表需要填充新的@Data_Table.Id(INSERTED.id,有效)和@NewData_Table.ObjectId(错误)。这样就可以创建一个具有从@Data_Table到@Tmp_Link_Table的外键关系的“链接表”。

编辑:

--Expected Output
--ObjectId  DataId
--11          3
--12          4
--13          5
--14          6

DECLARE @NewData_Table TABLE
(   [Data] VARCHAR(50) NOT NULL,
    ObjectId INT NOT NULL)

DECLARE @Tmp_Link_Table TABLE
(   ObjectId INT NOT NULL,
    DataId INT NOT NULL)

DECLARE @Data_Table TABLE
(   Id INT NOT NULL Identity(1,1),
    Data VARCHAR(50) NOT NULL)

-- create new objects
INSERT INTO @NewData_Table (ObjectId, Data) VALUES (11,'Data 1')
INSERT INTO @NewData_Table (ObjectId, Data) VALUES (12,'Data 2')
INSERT INTO @NewData_Table (ObjectId, Data) VALUES (13,'Data 3')
INSERT INTO @NewData_Table (ObjectId, Data) VALUES (14,'Data 4')
SELECT * FROM @NewData_Table

-- create some data
INSERT INTO @Data_Table (Data) VALUES ('Data One')
INSERT INTO @Data_Table (Data) VALUES ('Data Two')
--@Data_Table BEFORE
SELECT * FROM @Data_Table
Run Code Online (Sandbox Code Playgroud)

--Q!: 为什么“Msg 4104,Level 16,State 1,Line 27 无法绑定多部分标识符“d.ObjectId”。”?

INSERT INTO @Data_Table (Data)    OUTPUT d.ObjectId, INSERTED.Id INTO @Tmp_Link_Table (ObjectId, DataId)
SELECT d.Data
FROM @NewData_Table AS d 

--@Data_Table AFTER
SELECT * FROM @Data_Table

--Linked table from INSERT
SELECT * FROM @Tmp_Link_Table 
Run Code Online (Sandbox Code Playgroud)

参考:OUTPUT 子句 (Transact-SQL)

ZLK*_*ZLK 6

不幸的是,使用INSERT语句,您无法输出不是插入列之一的列(尽管我似乎无法在文档中找到解释这一点的参考)。

有一种方法可以解决这个问题,即使用 merge 语句。

例如,更改这部分:

INSERT INTO @Data_Table (Data)    OUTPUT d.ObjectId, INSERTED.Id INTO @Tmp_Link_Table (ObjectId, DataId)
SELECT d.Data
FROM @NewData_Table AS d 
Run Code Online (Sandbox Code Playgroud)

对此:

MERGE @Data_Table AS DT
USING @NewData_Table AS NDT
ON 1 = 2 -- This never matches...
WHEN NOT MATCHED THEN -- So this is always true...
    INSERT (Data) 
    VALUES (NDT.Data) 
    OUTPUT NDT.ObjectId, INSERTED.id 
    INTO @Tmp_Link_Table (ObjectId, DataId);
Run Code Online (Sandbox Code Playgroud)