简体   繁体   English

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

[英]INSERT table alias not recognised in the OUTPUT clause

Why is the INSERT table alias not recognised in the OUTPUT/INSERTED line? 为什么在OUTPUT / INSERTED行中无法识别INSERT表别名?

EDIT: The linking table needs to be populated with new @Data_Table.Id (INSERTED.id, works), and the @NewData_Table.ObjectId (errors). 编辑:链接表需要填充新的@ Data_Table.Id(INSERTED.id,有效)和@ NewData_Table.ObjectId(错误)。 SO that a 'linking table', with a foreign key relationship from @Data_Table to @Tmp_Link_Table can be created. 这样就可以创建一个具有@Data_Table到@Tmp_Link_Table外键关系的“链接表”。

EDIT: 编辑:

--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

--Q!: Why "Msg 4104, Level 16, State 1, Line 27 The multi-part identifier "d.ObjectId" could not be bound."? --Q !:为什么“无法绑定消息4104,级别16,状态1,第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 

REF: OUTPUT Clause (Transact-SQL) REF: 输出子句(Transact-SQL)

Unfortunately, with INSERT statements, you cannot output a column that is not one of the inserted columns (though I can't seem to find a reference in the documentation that explains this). 不幸的是,使用INSERT语句,您无法输出不是所插入列之一的列(尽管我似乎无法在解释此内容的文档中找到参考)。

There is a way to get around this, by using a merge statement. 通过使用merge语句,有一种解决方法。

For example, change this part: 例如,更改此部分:

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

To this: 对此:

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);

You have to update your table schema and query as below to work: 您必须按以下方式更新表架构和查询才能工作:

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 INT
)

-- create new objects
INSERT INTO @NewData_Table (ObjectId, Data) VALUES (11,66)
INSERT INTO @NewData_Table (ObjectId, Data) VALUES (12,88)
INSERT INTO @NewData_Table (ObjectId, Data) VALUES (13,99)
INSERT INTO @NewData_Table (ObjectId, Data) VALUES (14,44)
SELECT * FROM @NewData_Table

-- create some data
INSERT INTO @Data_Table (Data) VALUES (44)
INSERT INTO @Data_Table (Data) VALUES (55)
--@Data_Table BEFORE
SELECT * FROM @Data_Table

INSERT INTO @Data_Table (Data)    OUTPUT INSERTED.Data, 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 

Output (@Tmp_Link_Table): 输出(@Tmp_Link_Table):

在此处输入图片说明

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM