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)
不幸的是,使用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)