2017-04-20 45 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 –