2017-04-20 48 views
0

为什么INSERT表别名在OUTPUT/INSERTED行中未被识别?INSERT表别名在OUTPUT子句中未被识别

编辑:链接表需要填充新的@Data_Table.Id(INSERTED.id,works)和@ NewData_Table.ObjectId(errors)。因此可以创建一个'链接表',并且可以创建一个从@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') 
[email protected]_Table BEFORE 
SELECT * FROM @Data_Table 

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

[email protected]_Table AFTER 
SELECT * FROM @Data_Table 

--Linked table from INSERT 
SELECT * FROM @Tmp_Link_Table 

REF:OUTPUT Clause (Transact-SQL)

+0

将其更改为'OUTPUT INSERTED.Data,INSERTED.Id' – TriV

+0

编辑解释为什么INSERTED.Data不答案。 – OzBob

+0

接受的答案也张贴在https://social.msdn.microsoft.com/Forums/sqlserver/en-US/466e90f4-b4b9-401a-8043-d3309ea0e7b0/question-of-insert-with-output-clause?forum = transactsql在2011年:-) – OzBob

回答

0

你必须更新表架构和如下查询工作:

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) 
[email protected]_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 

[email protected]_Table AFTER 
SELECT * FROM @Data_Table 

--Linked table from INSERT 
SELECT * FROM @Tmp_Link_Table 

输出(@Tmp_Link_Table):

enter image description here

+0

我认为这不起作用“INSERT INTO Data_Table(Data)OUTPUT INSERTED.Data,INSERTED.Id INTO Tmp_Link_Table(ObjectId,DataId)” –

+0

它的工作我已测试,然后发布为答案 –

+0

好吧,也许我的错误。虐待尝试这一点,如果你的工作表现不佳你投了 –

2

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

有一种方法可以通过使用合并语句来解决此问题。

例如,更改这一部分:

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

要这样:

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

这是一个了不起的解决方案。我发现了一个类似的问题:https://social.msdn.microsoft.com/Forums/sqlserver/en-US/2d5ff792-a90a-4adc-a687-5c76ee22a5fe/include-column-from-table-in-select-在安嵌输出从句?论坛= TRANSACTSQL。我会引用你的回答。 – OzBob

+0

然后标记为已回答.. @ OzBob –