2016-03-30 58 views
1

我有一個臨時表如下複雜TSQL多行插入與輸出

DECLARE @InsertedRows TABLE (RevId INT, FooId INT) 

我也有其他的兩個表

Foo(FooId INT, MyData NVarchar(20)) 
Revisions(RevId INT, CreatedTimeStamp DATETIME) 

對於富每一行,我需要一個)插入一行插入修訂版,並b)插入一行到@InsertedRows與Foo和修訂版中的相應ID值。

我試着使用插入輸出選擇如下寫的東西:

INSERT INTO Revisions (CURRENT_TIMESTAMP) 
OUTPUT Inserted.RevId, Foo.FooId INTO @InsertedRows 
SELECT FooId From Foo 

然而,Foo.Id沒有在輸出列列表中允許的。另外,SELECT中返回的Id不會插入到表中,所以這是另一個問題。

我該如何解決這個問題?

+0

請準備完整的模式(標識列/ ...)和採樣數據。 http://sqlfiddle.com – lad2025

回答

2

不能使用INSERT語句在OUTPUT子句中引用FROM表。你只能用DELETE,UPDATE或MERGE語句來做到這一點。

從上OUTPUT子句(https://msdn.microsoft.com/en-us/library/ms177564.aspx

from_table_name的MSDN頁面是一個列前綴,指定包括在 的表從DELETE,UPDATE子句,或歸併使用 聲明指定要更新或刪除的行。

您可以使用MERGE語句來完成您所要求的。

在下面的示例中,我將表更改爲所有變量表,以便可以將其作爲獨立查詢運行,並將ID列更改爲IDENTITY列,這些列以不同方式遞增以說明關係。

ON子句(1 = 0)將始終評估爲NOT MATCHED。這意味着USING語句中的所有記錄都將用於插入到目標表中。此外,USING語句中的FROM表將可用於OUTPUT語句中。從上述查詢

DECLARE @Foo TABLE (FooId INT IDENTITY(1,1), MyData NVarchar(20)) 
DECLARE @Revisions TABLE (RevId INT IDENTITY(100,10), CreatedTimeStamp DATETIME) 
DECLARE @InsertedRows TABLE (RevId INT, FooId INT) 

INSERT INTO @Foo VALUES ('FooData1'), ('FooData2'), ('FooData3') 

MERGE @Revisions AS [Revisions] 
USING (SELECT FooId FROM @Foo) AS [Foo] 
ON (1=0) 
WHEN NOT MATCHED THEN 
INSERT (CreatedTimeStamp) VALUES (CURRENT_TIMESTAMP) 
OUTPUT INSERTED.RevId, Foo.FooId INTO @InsertedRows; 

SELECT * FROM @Foo 
SELECT * FROM @Revisions 
SELECT * FROM @InsertedRows 

表結果

@Foo table 
+-------+----------+ 
| FooId | MyData | 
+-------+----------+ 
|  1 | FooData1 | 
|  2 | FooData2 | 
|  3 | FooData3 | 
+-------+----------+ 

@Revisions table 
+-------+-------------------------+ 
| RevId | CreatedTimeStamp  | 
+-------+-------------------------+ 
| 100 | 2016-03-31 14:48:39.733 | 
| 110 | 2016-03-31 14:48:39.733 | 
| 120 | 2016-03-31 14:48:39.733 | 
+-------+-------------------------+ 

@InsertedRows table 
+-------+-------+ 
| RevId | FooId | 
+-------+-------+ 
| 100 |  1 | 
| 110 |  2 | 
| 120 |  3 | 
+-------+-------+