2016-03-30 10 views
1

ile bir geçici tablo Düzeltmeler'e ve b) @InsertedRows'a bir satır ekleyin ve Foo ve Revisions'lardan karşılık gelen Id değerlerini girin.Kompleks TSQL multirow yerleştirin çıkış

ben şöyle takın Çıktı Seç kullanarak bir şey yazmaya denedim:

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

Ancak Foo.Id Çıktı sütun listesinde izin verilmez. Ayrıca, SELECT içinde döndürülen kimlik tablonun içine eklenmez, bu yüzden başka bir sorun.

Bunu nasıl çözebilirim?

+0

tam şema (kimlik sütunları/...) ve örnek verileri hazırlayın. http://sqlfiddle.com – lad2025

cevap

2

FROM tablosunu bir INSERT deyimiyle bir OUTPUT yan tümcesinde başvuruda bulunamazsınız. Bunu yalnızca bir DELETE, UPDATE veya MERGE deyimiyle yapabilirsiniz. ÇIKIŞ maddesinin (https://msdn.microsoft.com/en-us/library/ms177564.aspx)

from_table_name MSDN sayfasından

bir DELETE, UPDATE FROM deyiminde dahil bir tablo belirten bir sütun önek mi, yoksa kullanılır deyimi BİRLEŞMEK Güncellenecek veya silinecek satırları belirtmek için

Ne istediğinizi gerçekleştirmek için bir MERGE deyimi kullanabilirsiniz.

Aşağıdaki örnekte, tüm değişken tabloların olması için tabloları değiştirdim, böylece bunlar bağımsız bir sorgu olarak çalıştırılabilir ve kimlik sütunlarını ilişkiyi göstermek için farklı olarak artan IDENTITY sütunlarına değiştirdim.

ON yan tümcesi (1 = 0) her zaman DEĞİL DEĞİLDİR. Bu, USING deyimindeki tüm kayıtların hedef tabloya eklemek için kullanacağı anlamına gelir. Ayrıca, USING deyimindeki FROM tablosu OUTPUT deyiminde kullanıma hazır olacaktır. sorguda yukarıdan

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 

Tablo sonuçları

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