Table Value Constructor
Aşağıdaki script’te öncelikle klasik INSERT cümlesi ile tablodaki her bir satırı oluşturacak kayıtlar tek tek eklenmiştir.
USEmaster
GO
CREATEDATABASEDemo
GO
USEDEMO
GO
CREATETABLEMusteri(
IDINTIDENTITY(1,1)NOTNULL,
AdiVARCHAR(50)NULL,
SoyAdiVARCHAR(50)NULL,
SehirVARCHAR(50),
YasTINYINT
)
GO
-- Klasik kayıt ekleme yöntemi
INSERTINTOMusteri(Adi,SoyAdi,Sehir,Yas)
VALUES ('Ahmet','YILMAZ','ISTANBUL',66)
INSERTINTOMusteri(Adi,SoyAdi,Sehir,Yas)
VALUES ('Kadir','GERGEÇ','ISTANBUL',42)
INSERTINTOMusteri(Adi,SoyAdi,Sehir,Yas)
VALUES ('MEHMET','KARA','ANKARA',15)
INSERTINTOMusteri(Adi,SoyAdi,Sehir,Yas)
VALUES ('ABDUL','FERİT','ANKARA',54)
INSERTINTOMusteri(Adi,SoyAdi,Sehir,Yas)
VALUES ('SATIR','SOYLU','İZMİR',39)
INSERTINTOMusteri(Adi,SoyAdi,Sehir,Yas)
VALUES ('GALİP','ŞANCI','İZMİR',21)
Aynı INSERT işlemini Table Value Contructor özelliği ile aşağıdaki şekilde de yapmak mümkündür.
-- Table Value Constructor ile kayıt ekleme
INSERTINTOMusteri(Adi,SoyAdi,Sehir,Yas)
VALUES ('Ahmet','YILMAZ','ISTANBUL',66),
('Kadir','GERGEÇ','ISTANBUL',42),
('MEHMET','KARA','ANKARA',15),
('ABDUL','FERİT','ANKARA',54),
('SATIR','SOYLU','İZMİR',39),
('GALİP','ŞANCI','İZMİR',21)
Table Value Contructor özelliğinde INSERT ile eklenecek kayıtları sabit değerlerle belirtmenin yanında SELECT cümlesi ile yapılandırarak VALUES kısmını dinamik oluşturmak mümkündür.
-- Table Value Constructor ile sabit kayıtlarla birlikte yazılan SELECT sonucundan dönen -- coklu kayıtların birlikte eklenmesi
-- Eğer Values kısmında SELECT ile başka tablodan kayıt alınıyor ise TEK kayıt
-- dönmelidir, aksi takdirde aşağıdaki hata dönecektir.
/*
Msg 512, Level 16, State 1, Line 1
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
The statement has been terminated.
*/
INSERTINTOMusteriGenc(Adi,SoyAdi,Sehir,Yas)
VALUES ('Aslı','TÜRK','DIYARBAKIR',12),
('Emre','DALGIN','SİVAS',17),
((SELECTAdiFROMMusteriWHEREID=1),-- sonuc tek kayıt
(SELECTSoyAdiFROMMusteriWHEREID=1), -- sonuc tek kayıt
(SELECTSehirFROMMusteriWHEREID=1),-- sonuc tek kayıt
(SELECTYasFROMMusteriWHEREID=1));-- sonuc tek kayıt

Oluşturulan örnek objelerin temizlenmesi
-- DROP
DROPTABLEMusteriGenc
DROPTABLEMusteri
GO
USEMASTER
GO
DROPDATABASEDemo
Limitler:
Table value constructor ile en fazla 1000 kayıt INSERT edilebilir, 1000 kayıt üzerinde INSERT yapılmak istendiğinde “Error 10738 is returned if the number of rows exceeds 1000” hatası dönecektir, bu durumda BCP, Bulk Insert, tek tek INSERT yapan SQL cümleleri veya SELECT…INSERT cümlesi kullanılmalıdır.
Referanslar: