Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Şunlar için geçerlidir:SQL Server
Azure SQL Veritabanı
Azure SQL Yönetilen Örneği
Azure Synapse Analytics
Analiz Platformu Sistemi (PDW)
Microsoft Fabric'te
ambarMicrosoft Fabric'te SQL veritabanı
SQL Server'da bir tabloya veya görünüme bir veya daha fazla satır ekler. Örnekler için bkz. Örnekler.
Transact-SQL söz dizimi kuralları
Tip
Microsoft Fabric Data Warehouse geleceğe hazır mimariye, yerleşik yapay zekaya ve yeni özelliklere sahip data lake foundation üzerinde kurumsal ölçekli ilişkisel bir ambardır. Veri ambarı konusunda yeniyseniz Fabric Data Warehouse ile başlayın. Mevcut özel SQL havuzu iş yükleri, veri bilimi, gerçek zamanlı analiz ve raporlama alanlarında yeni özelliklere erişmek için Fabric'e yükseltilebilir.
Syntax
SQL Server ve Azure SQL Veritabanı ve Doku SQL veritabanı söz dizimi
-- Syntax for SQL Server and Azure SQL Database and Fabric SQL database
[ WITH <common_table_expression> [ ,...n ] ]
INSERT
{
[ TOP ( expression ) [ PERCENT ] ]
[ INTO ]
{ <object> | rowset_function_limited
[ WITH ( <Table_Hint_Limited> [ ...n ] ) ]
}
{
[ ( column_list ) ]
[ <OUTPUT Clause> ]
{ VALUES ( { DEFAULT | NULL | expression } [ ,...n ] ) [ ,...n ]
| derived_table
| execute_statement
| <dml_table_source>
| DEFAULT VALUES
}
}
}
[;]
<object> ::=
{
[ server_name . database_name . schema_name .
| database_name .[ schema_name ] .
| schema_name .
]
table_or_view_name
}
<dml_table_source> ::=
SELECT <select_list>
FROM ( <dml_statement_with_output_clause> )
[AS] table_alias [ ( column_alias [ ,...n ] ) ]
[ WHERE <search_condition> ]
[ OPTION ( <query_hint> [ ,...n ] ) ]
-- External tool only syntax
INSERT
{
[BULK]
{ database_name.schema_name.table_or_view_name | schema_name.table_or_view_name | table_or_view_name }
( <column_definition> )
[ WITH (
[ [ , ] CHECK_CONSTRAINTS ]
[ [ , ] FIRE_TRIGGERS ]
[ [ , ] KEEP_NULLS ]
[ [ , ] KILOBYTES_PER_BATCH = kilobytes_per_batch ]
[ [ , ] ROWS_PER_BATCH = rows_per_batch ]
[ [ , ] ORDER ( { column [ ASC | DESC ] } [ ,...n ] ) ]
[ [ , ] TABLOCK ]
) ]
}
[; ] <column_definition> ::=
column_name <data_type>
[ COLLATE collation_name ]
[ NULL | NOT NULL ]
<data type> ::=
[ type_schema_name . ] type_name
[ ( precision [ , scale ] | max ]
Azure Synapse Analytics ve Paralel Veri Ambarı ve Microsoft Fabric Ambarı söz dizimi
-- Syntax for Azure Synapse Analytics and Parallel Data Warehouse and Microsoft Fabric
INSERT [INTO] { database_name.schema_name.table_name | schema_name.table_name | table_name }
[ ( column_name [ ,...n ] ) ]
{
VALUES ( { NULL | expression } )
| SELECT <select_criteria>
}
[ OPTION ( <query_option> [ ,...n ] ) ]
[;]
Arguments
ILE <common_table_expression>
Geçici adlandırılmış sonuç kümesini, yani ortak tablo ifadesini belirtir; bu küme ifadenin INSERT kapsamında tanımlanır. Sonuç kümesi bir SELECT deyiminden türetilir. Daha fazla bilgi için bkz. WITH common_table_expression (Transact-SQL).
TOP (ifade) [ YÜZDE ]
Eklenecek rastgele satırların sayısını veya yüzdesini belirtir.
ifade bir sayı veya satırların yüzdesi olabilir. Daha fazla bilgi için bkz. TOP (Transact-SQL).
INTO
ile hedef tablo arasında INSERT kullanılabilen isteğe bağlı bir anahtar sözcüktür.
server_name
için geçerlidir: SQL Server 2008 (10.0.x) ve üzeri.
Tablo veya görünümün bulunduğu bağlı sunucunun adıdır. server_namebağlı sunucu adı olarak veya OPENDATASOURCE işlevi kullanılarak belirtilebilir.
bağlı sunucu olarak server_name belirtildiğinde , database_name ve schema_name gerekir. OPENDATASOURCE ile server_name belirtildiğinde, database_name ve schema_name tüm veri kaynakları için geçerli olmayabilir ve uzak nesneye erişen OLE DB sağlayıcısının özelliklerine tabidir.
database_name
için geçerlidir: SQL Server 2008 (10.0.x) ve üzeri.
Veritabanının adıdır.
schema_name
Tablo veya görünümün ait olduğu şemanın adıdır.
table_or view_name
Verileri alacak tablonun veya görünümün adıdır.
Kapsamı dahilinde bir tablo değişkeni, bir INSERT ifadede tablo kaynağı olarak kullanılabilir.
table_or_view_name tarafından başvuruda bulunılan görünümün güncelleştirilebilir olması ve görünümün FROM yan tümcesinde tam olarak bir temel tabloya başvurması gerekir. Örneğin, çoklu tablo görünümüne girmek, INSERT yalnızca bir temel tablodan sütunlara referans veren bir column_list kullanmak zorundadır. Güncellenebilir görünümler hakkında daha fazla bilgi için bkz.CREATE VIEW (Transact-SQL)
rowset_function_limited
için geçerlidir: SQL Server 2008 (10.0.x) ve üzeri.
OPENQUERY veya OPENROWSET işlevidir. Bu işlevlerin kullanımı, uzak nesneye erişen OLE DB sağlayıcısının özelliklerine tabidir.
WITH ( <table_hint_limited> [... n ] )
Hedef tablo için izin verilen bir veya daha fazla tablo ipucunu belirtir. WITH anahtar sözcüğü ve parantezler gereklidir.
READPAST, NOLOCK ve READUNCOMMITTED'a izin verilmez. Tablo ipuçları hakkında daha fazla bilgi için bkz. Tablo İpuçları (Transact-SQL).
Important
Bildirim hedefi olan tablolarda INSERT HOLDLOCK, SERIALIZABLE, READCOMMITTED, REPEATABLEREAD veya UPDLOCK ipuçlarını belirtme yeteneği, gelecekteki SQL Server sürümlerinde kaldırılacaktır. Bu ipuçları ifadelerin INSERT performansını etkilemez. Bunları yeni geliştirme çalışmalarında kullanmaktan kaçının ve şu anda bunları kullanan uygulamaları değiştirmeyi planlayın.
Bir INSERT ifadenin hedefi olan bir tabloda TABLOCK ipucunu belirtmek, TABLOCKX ipucunu belirtmekle aynı etkiye sahiptir. Masada özel bir kilit alınır.
(column_list)
Verilerin eklendiği bir veya daha fazla sütunun listesidir.
column_list ayraç içine alınmalı ve virgülle sınırlandırılmalıdır.
Sütun column_list değilse, Veritabanı Altyapısı sütunun tanımına göre bir değer sağlayabilmelidir; aksi takdirde, satır yüklenemez. Veritabanı Altyapısı, sütun için aşağıdakiler geçerliyse otomatik olarak bir değer sağlar:
Bir IDENTITY özelliği var. Sonraki artımlı kimlik değeri kullanılır.
Varsayılan değere sahiptir. Sütun için varsayılan değer kullanılır.
Zaman damgası veri türüne sahiptir. Geçerli zaman damgası değeri kullanılır.
Boş değer atanabilir. Null değer kullanılır.
Hesaplanan bir sütundur. Hesaplanan değer kullanılır.
column_list kimlik sütununa açık değerler eklendiğinde kullanılmalıdır ve tablo için seçenek SET IDENTITY_INSERT ON olmalıdır.
OUTPUT Maddesi
Eklenen satırları ekleme işleminin bir parçası olarak döndürür. Sonuçlar işleme uygulamasına döndürülebilir veya daha fazla işlem için bir tablo veya tablo değişkenine eklenebilir.
OUTPUT maddesi, yerel bölümlenmiş görünümlere, dağıtılmış bölümlenmiş görünümlere, uzak tablolara veya INSERTexecute_statement içeren iyimlere referans veren DML ifadelerinde desteklenmez. OUTPUT INTO cümlesi, dml_table_source> maddesi içeren <ifadelerde desteklenmezINSERT. Bu yan tümcenin bağımsız değişkenleri ve davranışı hakkında daha fazla bilgi için bkz. OUTPUT Yan Tümcesi (Transact-SQL).
VALUES
Eklenecek veri değerlerinin listesini veya listelerini tanıtır. column_list,belirtilmişse veya tablodaki her sütun için bir veri değeri olmalıdır. Değer listesi ayraç içine alınmalıdır.
Değer listesindeki değerler tablodaki sütunlarla aynı sırada değilse veya tablodaki her sütun için bir değere sahip değilse, column_list gelen her değeri depolayan sütunu açıkça belirtmek için kullanılmalıdır.
Transact-SQL satır oluşturucuyu (tablo değeri oluşturucu olarak da adlandırılır) tek bir ifadede INSERT birden fazla satır belirtmek için kullanabilirsiniz. Satır oluşturucu, parantez içine alınmış ve virgülle ayrılmış birden çok değer listesi içeren tek bir VALUES yan tümcesi oluşur. Daha fazla bilgi için bkz. Tablo Değeri Oluşturucu (Transact-SQL).
Note
Tablo değeri oluşturucu, Azure Synapse Analytics'te desteklenmez. Bunun yerine, birden çok satır eklemek için sonraki INSERT deyimler yürütülebilir. Azure Synapse Analytics'te ekleme değerleri yalnızca sabit değişmez değerler veya değişken başvuruları olabilir. Sabit olmayan bir değer eklemek için değişkeni sabit olmayan bir değere ayarlayın ve değişkeni ekleyin.
DEFAULT
Veritabanı Altyapısı'nı bir sütun için tanımlanan varsayılan değeri yüklemeye zorlar. Sütun için varsayılan değer yoksa ve sütun null değerlere izin veriyorsa, NULL eklenir.
Zaman damgası veri türüyle tanımlanan bir sütun için sonraki zaman damgası değeri eklenir.
DEFAULT bir kimlik sütunu için geçerli değil.
expression
Sabit, değişken veya ifadedir. İfade execute deyimi içeremez.
Nchar, nvarchar ve ntext Unicode karakter veri türlerine başvuruda bulunurken, 'expression' ön ekinde 'N' büyük harfi bulunmalıdır. 'N' belirtilmezse, SQL Server dizeyi veritabanı veya sütunun varsayılan harmanlamasına karşılık gelen kod sayfasına dönüştürür. Bu kod sayfasında bulunmayan karakterler kaybolur.
derived_table
Tabloya yüklenecek veri satırlarını döndüren geçerli bir SELECT deyimidir. SELECT deyimi ortak bir tablo ifadesi (CTE) içeremez.
execute_statement
SELECT veya READTEXT deyimleriyle veri döndüren geçerli bir EXECUTE deyimidir. Daha fazla bilgi için bkz . EXECUTE (Transact-SQL).
EXECUTE ifadesinin RESULT SETS seçenekleri bir INSERT... EXECUTIVE açıklaması.
Eğer execute_statement ile INSERTkullanılırsa, her sonuç kümesi tablodaki veya column_list'daki sütunlarla uyumlu olmalıdır.
execute_statement , saklı yordamları aynı sunucuda veya uzak sunucuda yürütmek için kullanılabilir. Uzak sunucudaki yordam yürütülür ve sonuç kümeleri yerel sunucuya döndürülür ve yerel sunucudaki tabloya yüklenir. Dağıtılmış bir işlemde , bağlantı birden çok etkin sonuç kümesi (MARS) etkinleştirildiğinde execute_statement geri döngü bağlı sunucusuna karşı verilemez.
execute_statement READTEXT deyimiyle veri döndürürse, her READTEXT deyimi en fazla 1 MB (1024 KB) veri döndürebilir. execute_statement genişletilmiş yordamlarla da kullanılabilir. execute_statement genişletilmiş yordamın ana iş parçacığı tarafından döndürülen verileri ekler; ancak, ana iş parçacığı dışındaki iş parçacıklarının çıkışı eklenmez.
Bir tablo değerli parametreyi EXEC ifadesinin INSERT hedefi olarak belirtemezsiniz; ancak EXEC dizisinde veya depolanmış prosedürde kaynak INSERT olarak belirtilebilir. Daha fazla bilgi için bkz . Table-Valued Parametreleri (Veritabanı Altyapısı) kullanma.
<dml_table_source>
Hedef tabloya eklenen satırların, bir INSERT, UPDATE, DELETE, veya MERGE i'lenin OUTPUT maddesi tarafından döndürülen, isteğe bağlı olarak WHERE cümlesi tarafından filtrelenen satırlar olduğunu belirtir. Eğer <dml_table_source> belirtilmişse, dış INSERT ifadenin hedefi aşağıdaki kısıtlamaları karşılamalıdır:
Görünüm değil temel tablo olmalıdır.
Uzak bir tablo olamaz.
Üzerinde tanımlı tetikleyici olamaz.
Birincil anahtar-yabancı anahtar ilişkilerine katılamaz.
İşlem çoğaltması için birleştirme çoğaltması veya güncelleştirilebilir aboneliklere katılamaz.
Veritabanının uyumluluk düzeyi 100 veya üzeri olarak ayarlanmalıdır. Daha fazla bilgi için bkz. OUTPUT Yan Tümcesi (Transact-SQL).
<Select_list>
OUTPUT yan tümcesi tarafından hangi sütunların ekleneceğini belirten virgülle ayrılmış bir listedir. select_list< içindeki >sütunlar, değerlerin eklendiği sütunlarla uyumlu olmalıdır.
<
> select_list toplama işlevlerine veya TEXTPTR'ye başvuramaz.
Note
SELECT listesinde listelenen tüm değişkenler, dml_statement_with_output_clause'de< yapılan değişikliklerden bağımsız olarak özgün değerlerine başvurur>.
<dml_statement_with_output_clause>
OUTPUT maddesinde etkilenen satırları döndüren geçerli INSERTbir , UPDATE, DELETE, veya MERGE ifadedir. deyimi bir WITH yan tümcesi içeremez ve uzak tabloları veya bölümlenmiş görünümleri hedefleyemez. Eğer UPDATE veya DELETE belirtilmişse, bu bir imleç tabanlı UPDATE veya DELETEolamaz. Kaynak satırlara iç içe DML deyimleri olarak başvurulamaz.
NEREDE <search_condition>
dml_statement_with_output_clause tarafından <döndürülen satırları filtreleyen geçerli >bir search_condition<> içeren herhangi bir WHERE yan tümcesi mi? Daha fazla bilgi için bkz. Arama Koşulu (Transact-SQL). Bu bağlamda kullanıldığında, <search_condition> alt sorgular, veri erişimi gerçekleştiren skaler kullanıcı tanımlı işlevler, toplama işlevleri, TEXTPTR veya tam metin arama koşullarını içeremez.
DEFAULT DEĞERLER
için geçerlidir: SQL Server 2008 (10.0.x) ve üzeri.
Yeni satırı her sütun için tanımlanan varsayılan değerleri içerecek şekilde zorlar.
YIĞIN
için geçerlidir: SQL Server 2008 (10.0.x) ve üzeri.
Dış araçlar tarafından ikili veri akışını karşıya yüklemek için kullanılır. Bu seçenek SQL Server Management Studio, SQLCMD, OSQL gibi araçlarla veya SQL Server Yerel İstemcisi gibi veri erişimi uygulama programlama arabirimleriyle kullanılmak üzere tasarlanmamıştır.
FIRE_TRIGGERS
için geçerlidir: SQL Server 2008 (10.0.x) ve üzeri.
Hedef tabloda tanımlanan tüm ekleme tetikleyicilerinin ikili veri akışı karşıya yükleme işlemi sırasında yürütüldüğünü belirtir. Daha fazla bilgi için bkz BULK INSERT . (Transact-SQL).
CHECK_CONSTRAINTS
için geçerlidir: SQL Server 2008 (10.0.x) ve üzeri.
İkili veri akışı karşıya yükleme işlemi sırasında hedef tablo veya görünümdeki tüm kısıtlamaların denetlenebilmesi gerektiğini belirtir. Daha fazla bilgi için bkz BULK INSERT . (Transact-SQL).
KEEPNULLS
için geçerlidir: SQL Server 2008 (10.0.x) ve üzeri.
İkili veri akışı karşıya yükleme işlemi sırasında boş sütunların null değeri tutması gerektiğini belirtir. Daha fazla bilgi için bkz. Null Değerleri Koru veya Toplu İçeri Aktarma Sırasında Varsayılan Değerleri Kullanma (SQL Server).
KILOBYTES_PER_BATCH = kilobytes_per_batch
Kilobytes_per_batch olarak toplu iş başına yaklaşık kilobayt (KB) veri sayısını belirtir. Daha fazla bilgi için bkz BULK INSERT . (Transact-SQL).
ROWS_PER_BATCH =rows_per_batch
için geçerlidir: SQL Server 2008 (10.0.x) ve üzeri.
İkili veri akışındaki yaklaşık veri satır sayısını gösterir. Daha fazla bilgi için bkz BULK INSERT . (Transact-SQL).
Note
Sütun listesi sağlanmazsa söz dizimi hatası oluşur.
Remarks
SQL grafik tablolarına veri eklemeye özel bilgi için bkz.INSERT (SQL Grafiği).
MAXDOP sorgu ipucu, SELECT bölümü dış kaynaklardan okunduğunda SELECT işlemleri sırasında desteklenmez INSERT .
En İyi Yöntemler
Eklenen satır sayısını istemci uygulamasına döndürmek için @@ROWCOUNT fonksiyonunu kullanın. Daha fazla bilgi için @@ROWCOUNT (Transact-SQL) adresine bakınız.
Verileri Toplu İçeri Aktarma için En İyi Yöntemler
Using INSERT INTO... SELECT to Bulk Verisi minimum kayıt ve paralellik ile aktarma
Çok sayıda satırı hazırlama tablosu gibi bir tablodan en az günlüğe kaydetmeye sahip başka bir tabloya verimli bir şekilde aktarmak için kullanabilirsiniz INSERT INTO <target_table> SELECT <columns> FROM <source_table> . Minimum günlük kaydı deyiminin performansını artırabilir ve işlemin işlem sırasında kullanılabilir işlem günlüğü alanını doldurma olasılığını azaltabilir.
Bu deyim için minimum günlük kaydı aşağıdaki gereksinimlere sahiptir:
- Veritabanının kurtarma modeli basit veya toplu günlüğe kaydedilmiş olarak ayarlanır.
- Hedef tablo boş veya boş olmayan bir yığındır.
- Hedef tablo çoğaltmada kullanılmaz.
- İpucu
TABLOCKhedef tablo için belirtilir.
Bir MERGE ifade içinde bir insert eylemi sonucu bir yığına eklenen satırlar da minimal şekilde kaydedilebilir.
BULK INSERT daha az kısıtlayıcı bir Toplu Güncelleştirme (BU) kilidi tutan deyiminden INSERT INTO ... SELECT farklı olarak, TABLOCK ipucu tabloda özel (X) bir kilit tutar. Bu, aynı anda yürütülen birden çok ekleme işlemi kullanarak satır ekleyemeyeceğiniz anlamına gelir.
Ancak, SQL Server 2016 (13.x) ve veritabanı uyumluluk düzeyi 130'dan başlayarak, yığınlara veya kümelenmiş columnstore dizinlerine (CCI) eklerken tek INSERT INTO ... SELECT bir deyim paralel olarak yürütülebilir. İpucu kullanılırken TABLOCK paralel eklemeler yapılabilir.
Yukarıdaki deyim için paralellik, en az günlüğe kaydetme gereksinimlerine benzer olan aşağıdaki gereksinimlere sahiptir:
- Hedef tablo boş veya boş olmayan bir yığındır.
- Hedef tabloda kümelenmiş columnstore dizini (CCI) vardır ancak kümelenmemiş dizinler yoktur.
- Hedef tabloda OFF olarak ayarlanmış bir kimlik sütunu IDENTITY_INSERT yoktur.
- İpucu
TABLOCKhedef tablo için belirtilir.
Minimum günlüğe kaydetme ve paralel ekleme gereksinimlerinin karşılandığı senaryolarda her iki geliştirme de birlikte çalışarak veri yükü işlemlerinizin en yüksek aktarım hızını sağlar.
Microsoft Fabric'te Depo kullanımıyla INSERT ilgili daha fazla bilgi için, Transact-SQL kullanarak Verileri Depoya Alın sayfasına bakabilirsiniz.
Note
Yerel geçici tablolara (# önekiyle tanımlanır) ve genel geçici tablolara (## ön ekleriyle tanımlanır) ekler, TABLOCK ipucu kullanılarak paralellik için de etkinleştirilir.
Verileri Toplu İçeri Aktarmak için OPENROWSET ve BULK Kullanma
OPENROWSET fonksiyonu, aşağıdaki tablo ipuçlarını kabul edebilir ve bu ipuçları bu ifadeyle INSERT toplu yükleme optimizasyonları sağlar:
- İpucu,
TABLOCKekleme işlemi için günlük kayıtlarının sayısını en aza indirebilirsiniz. Veritabanının kurtarma modeli basit veya toplu günlüğe kaydedilmiş olarak ayarlanmalıdır ve hedef tablo çoğaltmada kullanılamaz. Daha fazla bilgi için bkz. Toplu İçeri Aktarmada En Az Günlüğe Kaydetme Önkoşulları. - İpucu paralel
TABLOCKekleme işlemlerini etkinleştirebilir. Hedef tablo, kümelenmemiş dizinleri olmayan bir yığın veya kümelenmiş columnstore dizinidir (CCI) ve hedef tabloda bir kimlik sütunu belirtilemez. - İpucu,
IGNORE_CONSTRAINTSFOREIGN KEY ve CHECK kısıtlama denetimini geçici olarak devre dışı bırakabilir. - İpucu
IGNORE_TRIGGERStetikleyici yürütmeyi geçici olarak devre dışı bırakabilir. - İpucu,
KEEPDEFAULTSveri kaydında sütun için değer olmadığında tablo sütununun varsayılan değerinin (varsa) NULL yerine eklenmesine izin verir. - İpucu,
KEEPIDENTITYiçeri aktarılan veri dosyasındaki kimlik değerlerinin hedef tablodaki kimlik sütunu için kullanılmasını sağlar.
Bu iyileştirmeler komutuyla kullanılabilenlere BULK INSERT benzer. Daha fazla bilgi için bkz. Tablo İpuçları (Transact-SQL).
Veri Türleri
Satır eklerken aşağıdaki veri türü davranışını göz önünde bulundurun:
Bir değer, char,varchar veya varbinary veri tipine sahip sütunlara yükleniyorsa, takip eden boşlukların ( char ve varchar için boşluklar, varbinary için sıfırlar) doldurulması veya kısaltılması, tablo oluşturulduğunda sütun için tanımlanan ayar tarafından belirlenir SET ANSI_PADDING . Daha fazla bilgi için bkz SET ANSI_PADDING . (Transact-SQL).
Aşağıdaki tablo, OFF için SET ANSI_PADDING varsayılan işlemi göstermektedir.
Veri türü Varsayılan işlem char Sütunun tanımlı genişliğine boşluklar içeren tuş takımı değeri. varchar Sondaki boşlukları boşluk olmayan son karaktere veya yalnızca boşluklardan oluşan dizeler için tek boşluklu bir karaktere kaldırın. varbinary Sondaki sıfırları kaldırın. Varchar veya metin veri türüne sahip bir sütuna boş bir dize (' ') yüklenirse, varsayılan işlem sıfır uzunlukta bir dize yüklemektir.
Bir metin veya görüntü sütununa null değer eklemek geçerli bir metin işaretçisi oluşturmaz ve 8 KB'lık bir metin sayfasının yerini almaz.
Uniqueidentifier veri türüyle oluşturulan sütunlar özel olarak biçimlendirilmiş 16 baytlık ikili değerleri depolar. Kimlik sütunlarının aksine, Veritabanı Altyapısı benzersiz belirleyici veri türüne sahip sütunlar için otomatik olarak değer oluşturmaz. Ekleme işlemi sırasında, xxxxxx-xxxx-xxxxxxbiçimindeki benzersizidentifier veri türüne ve dize sabitlerine sahip değişkenler (x'in 0-9 veya a-f aralığında onaltılık bir basamak olduğu kısa çizgileri içeren 36 karakter) benzersizidentifier sütunları için kullanılabilir. Örneğin, 6F9619FF-8B86-D011-B42D-00C04FC964FF , benzersiz tanımlayıcı değişkeni veya sütunu için geçerli bir değerdir. Genel olarak benzersiz bir kimlik (GUID) almak için NEWID() işlevini kullanın.
User-Defined Tür Sütunlarına Değer Ekleme
Kullanıcı tanımlı tür sütunlarına şu şekilde değer ekleyebilirsiniz:
Kullanıcı tanımlı türün değerini sağlama.
Kullanıcı tanımlı tür bu türden örtük veya açık dönüştürmeyi desteklediği sürece SQL Server sistem veri türünde bir değer sağlama. Aşağıdaki örnekte, bir dizeden açıkça dönüştürerek kullanıcı tanımlı türdeki
Pointbir sütuna değer ekleme işlemi gösterilmektedir.INSERT INTO Cities (Location) VALUES ( CONVERT(Point, '12.3:46.2') );Kullanıcı tanımlı tüm türler örtük olarak ikiliden dönüştürülebildiğinden, açık dönüştürme gerçekleştirilmeden de ikili değer sağlanabilir.
Kullanıcı tanımlı türün değerini döndüren kullanıcı tanımlı bir işlevi çağırma. Aşağıdaki örnek, kullanıcı tanımlı türde
CreateNewPoint()yeni bir değer oluşturmak ve değeri tabloyaPointeklemek için kullanıcı tanımlı bir işlevCitieskullanır.INSERT INTO Cities (Location) VALUES ( dbo.CreateNewPoint(x, y) );
Hata İşleme
INSERT Bir TRY... CATCH yapı.
Bir INSERT ifade bir kısıtlama veya kuralı ihlal ederse veya sütunun veri tipiyle uyumlu olmayan bir değeri varsa, ifade başarısız olur ve hata mesajı döner.
Eğer INSERT birden fazla satır SELECT veya EXECUTE ile yükleniyorsa, yüklenen değerlerden kaynaklanan herhangi bir kural veya kısıtlama ihlali ifadenin durdurulmasına ve satır yüklenmemesine neden olur.
Bir INSERT ifade ifade değerlendirmesi sırasında aritmetik bir hata (taşma, sıfıra bölme veya alan hatası gibi) karşılaştığında, Database Engine bu hataları ON'a SET ARITHABORT ayarlıymış gibi ele alır. Toplu iş durdurulur ve bir hata iletisi döndürülür. İfade değerlendirmesi sırasında, SET ARITHABORT veSET ANSI_WARNINGSSETKAPALı olduğunda, bir INSERT, DELETE veya UPDATE ifade aritmetik hata, taşma, sıfıra bölme veya alan hatası ile karşılaşırsa, SQL Server bir NULL değeri ekler veya günceller. Hedef sütun boş değer atanamazsa ekleme veya güncelleştirme eylemi başarısız olur ve kullanıcı hata alır.
Interoperability
Bir INSTEAD OF tetikleyici, INSERT bir tabloya veya görünüme karşı eylemler üzerinde tanımlandığında, tetikleyici ifadenin INSERT yerine çalıştırılır. Tetikleyiciler hakkında INSTEAD OF daha fazla bilgi için (Transact-SQL) bölümünü ziyaret edinCREATE TRIGGER.
Sınırlamalar ve Kısıtlamalar
Uzak tablolara değer eklediğinizde ve tüm sütunlar için tüm değerler belirtilmediğinde, belirtilen değerlerin eklendiği sütunları tanımlamanız gerekir.
TOP ile INSERT birlikte kullanıldığında, referans edilen satırlar herhangi bir sırayla düzenlenmez ve ORDER BY maddesi bu ilerlerde doğrudan belirtilemez. Anlamlı bir kronolojik sırada satır eklemek için TOP kullanmanız gerekiyorsa, top öğesini bir alt seçim deyiminde belirtilen ORDER BY yan tümcesiyle birlikte kullanmanız gerekir. Bu konu başlığında yer alan Örnekler bölümüne bakın.
INSERT SELECT ile ORDER BY kullanılarak satır dolduran sorgular, kimlik değerlerinin nasıl hesaplandığını garanti eder ancak satır sırasının nasıl eklendiğini garanti etmez.
Parallel Data Warehouse'da, ORDER BY maddesi, GÖRÜNÜŞLERDE, CREATE TABLE SELECT, INSERT SELECT, satır içi fonksiyonlar, türeme tablolar, alt sorgular ve ortak tablo ifadeleri olarak geçersizdir; tabii ki TOP ayrıca belirtilmedikçe.
Kayıt Davranışı
Bu INSERT ifade her zaman tam olarak kaydedilir, ancak BULK anahtar kelimesi ile OPENROWSET fonksiyonu kullanılırsa veya kullanılır INSERT INTO <target_table> SELECT <columns> FROM <source_table>. Bu işlemler en düşük düzeyde günlüğe kaydedilebilir. Daha fazla bilgi için, bu konunun önceki bölümlerinde yer alan "Toplu Veri Yükleme için En İyi Yöntemler" bölümüne bakın.
Security
Bağlı sunucu bağlantısı sırasında, gönderen sunucu, alıcı sunucuya kendi adına bağlanmak için bir oturum açma adı ve parola sağlar. Bu bağlantının çalışması için, sp_addlinkedsrvlogin kullanarak bağlı sunucular arasında bir oturum açma eşlemesi oluşturmanız gerekir.
OPENROWSET(BULK...) kullandığınızda, SQL Server'ın kimliğe bürünmeyi nasıl işlediğini anlamak önemlidir. Daha fazla bilgi için, Toplu Verileri Kullanarak BULK INSERT İthale Et bölümünde veya OPENROWSET(BULK...) (SQL Server) bölümünde "Güvenlik Dikkate Alınması" bölümünü inceleyebilirsiniz.
Permissions
INSERT Hedef masada izin gereklidir.
INSERT Izinler, sabit sunucu rolünün üyelerine sysadmin , db_owner sabit veritabanı rollerine db_datawriter ve tablo sahibine varsayılan olarak aitti.
sysadmin, db_ownerve db_securityadmin rollerinin üyeleri ve tablo sahibi izinleri diğer kullanıcılara aktarabilir.
OPENROWSET fonksiyonu BULK seçeneğiyle çalıştırmak INSERT için, sabit sunucu rolünün sysadmin veya bulkadmin sabit sunucu rolünün üyesi olmanız gerekir.
Examples
| Category | Öne çıkan söz dizimi öğeleri |
|---|---|
| Temel sözdizimi | INSERT * tablo değeri oluşturucu |
| Sütun değerlerini işleme | IDENTITY * NEWID * varsayılan değerler * kullanıcı tanımlı türler |
| Diğer tablolardan veri ekleme | INSERT... SELECT * INSERT... ORTAK TABLO İfadesiyle * ÜST * OFSET GETIR * YÜRÜTÜN |
| Standart tablolar dışındaki hedef nesneleri belirtme | Görünümler * tablo değişkenleri |
| Uzak tabloya satır ekleme | Bağlı sunucu * OPENQUERY satır kümesi işlevi * OPENDATASOURCE satır kümesi işlevi |
| Tablolardan veya veri dosyalarından toplu veri yükleme | INSERT... SELECT * OPENROWSET fonksiyonu |
| İpuçlarını kullanarak sorgu iyileştiricisinin varsayılan davranışını geçersiz kılma | Tablo ipuçları |
| Açıklamanın INSERT sonuçlarını yakalamak | OUTPUT cümlesi |
Temel Söz Dizimi
Bu bölümdeki örnekler, minimum gerekli sözdizimi kullanarak ifadenin INSERT temel işlevselliğini göstermektedir.
A. Tek bir veri satırı ekleme
Aşağıdaki örnek, AdventureWorks2025 veritabanında tabloya bir satır Production.UnitMeasure ekler. Bu tablodaki sütunlar , UnitMeasureCodeve NameşeklindedirModifiedDate. Tüm sütunlar için değerler sağlandığından ve tablodaki sütunlarla aynı sırada listelendiği için, sütun adlarının sütun listesinde* belirtilmesi gerekmez.*
INSERT INTO Production.UnitMeasure
VALUES (N'FT', N'Feet', '20080414');
B. Birden çok veri satırı ekleme
Aşağıdaki örnek, AdventureWorks2025 veritabanındaki INSERT tabloya tek bir ifadede Production.UnitMeasure üç satır eklemek için tablo değer oluşturucusunu kullanır. Tüm sütunların değerleri sağlandığından ve tablodaki sütunlarla aynı sırada listelendiği için, sütun listesinde sütun adlarının belirtilmesi gerekmez.
Note
Tablo değeri oluşturucu, Azure Synapse Analytics'te desteklenmez.
INSERT INTO Production.UnitMeasure
VALUES (N'FT2', N'Square Feet ', '20080923'), (N'Y', N'Yards', '20080923')
, (N'Y3', N'Cubic Yards', '20080923');
C. Tablo sütunlarıyla aynı sırada olmayan verileri ekleme
Aşağıdaki örnek, her sütuna eklenen değerleri açıkça belirtmek için bir sütun listesi kullanır. AdventureWorks2025 veritabanındaki tablodaki sütun sırası Production.UnitMeasureUnitMeasureCode, Name, ; ModifiedDateancak sütunlar column_list'de bu sırayla listelenmemiştir.
INSERT INTO Production.UnitMeasure (Name, UnitMeasureCode,
ModifiedDate)
VALUES (N'Square Yards', N'Y2', GETDATE());
Sütun Değerlerini İşleme
Bu bölümdeki örnekler, bir IDENTITY özellik, DEFAULT değer veya benzersiz tanımlayıcı veya kullanıcı tarafından tanımlanan tip sütunlarla tanımlanan sütunlara değer ekleme yöntemlerini gösterir.
D. Varsayılan değerlere sahip sütunlar içeren bir tabloya veri ekleme
Aşağıdaki örnekte, otomatik olarak değer oluşturan veya varsayılan değere sahip sütunlar içeren bir tabloya satır ekleme işlemi gösterilmektedir.
Column_1 , bir dizeyi içine column_2eklenen değerle birleştirerek otomatik olarak değer oluşturan hesaplanan bir sütundur.
Column_2 varsayılan kısıtlamayla tanımlanır. Bu sütun için bir değer belirtilmezse, varsayılan değer kullanılır.
Column_3 , otomatik olarak benzersiz, artan bir ikili sayı oluşturan rowversion veri türüyle tanımlanır.
Column_4 otomatik olarak bir değer oluşturmaz. Bu sütun için bir değer belirtilmediğinde NULL eklenir. Bu ifadeler INSERT , bazı sütunlar için değerler içeren ancak hepsini içermeyen satırlar ekler. Son INSERT ifadede hiçbir sütun belirtilmez ve sadece varsayılan değerler VALUES maddesi kullanılarak DEFAULT eklenir.
CREATE TABLE dbo.T1
(
column_1 AS 'Computed column ' + column_2,
column_2 varchar(30)
CONSTRAINT default_name DEFAULT ('my column default'),
column_3 rowversion,
column_4 varchar(40) NULL
);
GO
INSERT INTO dbo.T1 (column_4)
VALUES ('Explicit value');
INSERT INTO dbo.T1 (column_2, column_4)
VALUES ('Explicit value', 'Explicit value');
INSERT INTO dbo.T1 (column_2)
VALUES ('Explicit value');
INSERT INTO T1 DEFAULT VALUES;
GO
SELECT column_1, column_2, column_3, column_4
FROM dbo.T1;
GO
E. Kimlik sütunu olan bir tabloya veri ekleme
Aşağıdaki örnekte, bir kimlik sütununa veri eklemenin farklı yöntemleri gösterilmektedir. İlk iki INSERT ifade, yeni satırlar için kimlik değerlerinin oluşturulmasına olanak tanır. Üçüncü INSERT cümle, ifadeyle SETSET IDENTITY_INSERT birlikte sütunun özelliğini IDENTITY geçersiz kılar ve kimlik sütununa açık bir değer ekler.
CREATE TABLE dbo.T1 ( column_1 int IDENTITY, column_2 VARCHAR(30));
GO
INSERT T1 VALUES ('Row #1');
INSERT T1 (column_2) VALUES ('Row #2');
GO
SET IDENTITY_INSERT T1 ON;
GO
INSERT INTO T1 (column_1,column_2)
VALUES (-99, 'Explicit identity value');
GO
SELECT column_1, column_2
FROM T1;
GO
F. NEWID() kullanarak uniqueidentifier sütununa veri ekleme
Aşağıdaki örnekte , için bir GUID elde etmek için column_2NEWID() işlevi kullanılır. Kimlik sütunlarının aksine, Veritabanı Altyapısı ikinci deyimde gösterildiği gibi INSERT veri türüne sahip sütunlar için otomatik olarak değer oluşturmaz.
CREATE TABLE dbo.T1
(
column_1 int IDENTITY,
column_2 uniqueidentifier,
);
GO
INSERT INTO dbo.T1 (column_2)
VALUES (NEWID());
INSERT INTO T1 DEFAULT VALUES;
GO
SELECT column_1, column_2
FROM dbo.T1;
G. Kullanıcı tanımlı tür sütunlarına veri ekleme
Aşağıdaki Transact-SQL deyimleri tablonun sütununa PointValuePoints üç satır ekler. Bu sütun CLR kullanıcı tanımlı bir tür (UDT) kullanır.
Point veri türü, UDT'nin özellikleri olarak gösterilen X ve Y tamsayı değerlerinden oluşur. Virgülle ayrılmış X ve Y değerlerini Point türe dönüştürmek için CAST veya CONVERT işlevini kullanmanız gerekir. İlk iki deyim, bir dize değerini türe dönüştürmek için Point ÇEVİr işlevini, üçüncü deyim ise CAST işlevini kullanır. Daha fazla bilgi için bkz . UDT Verilerini Düzenleme.
INSERT INTO dbo.Points (PointValue) VALUES (CONVERT(Point, '3,4'));
INSERT INTO dbo.Points (PointValue) VALUES (CONVERT(Point, '1,5'));
INSERT INTO dbo.Points (PointValue) VALUES (CAST ('1,99' AS Point));
Diğer Tablolardan Veri Ekleme
Bu bölümdeki örneklerde, bir tablodan başka bir tabloya satır ekleme yöntemleri gösterilmektedir.
H. Diğer tablolardan veri eklemek için SELECT ve EXECUTE seçeneklerini kullanma
Aşağıdaki örnek, bir tablodan başka bir tabloya veri nasıl ekleneceğini gösteriyor ... INSERT SELECT ya INSERTda ... UYGULA. Her biri, sütun listesinde bir ifade ve değişmez değer içeren çok tablolu SELECT deyimini temel alır.
İlk INSERT ifade, AdventureWorks2025 veritabanındaki kaynak tablolardan (Employee, SalesPerson, ve Person) verileri türetmek ve sonuç setini EmployeeSales tabloda saklamak için SELECT ifadesi kullanır. İkinci INSERT ifade, EXECUTE cümlesini kullanarak SELECT ifadesini içeren bir saklanan prosedürü çağırır, üçüncü INSERT ifade ise EXECUTE cümlesini kullanarak SELECT ifadesine literal bir dizi olarak referans verir.
CREATE TABLE dbo.EmployeeSales
( DataSource varchar(20) NOT NULL,
BusinessEntityID varchar(11) NOT NULL,
LastName varchar(40) NOT NULL,
SalesDollars money NOT NULL
);
GO
CREATE PROCEDURE dbo.uspGetEmployeeSales
AS
SET NOCOUNT ON;
SELECT 'PROCEDURE', sp.BusinessEntityID, c.LastName,
sp.SalesYTD
FROM Sales.SalesPerson AS sp
INNER JOIN Person.Person AS c
ON sp.BusinessEntityID = c.BusinessEntityID
WHERE sp.BusinessEntityID LIKE '2%'
ORDER BY sp.BusinessEntityID, c.LastName;
GO
--INSERT...SELECT example
INSERT INTO dbo.EmployeeSales
SELECT 'SELECT', sp.BusinessEntityID, c.LastName, sp.SalesYTD
FROM Sales.SalesPerson AS sp
INNER JOIN Person.Person AS c
ON sp.BusinessEntityID = c.BusinessEntityID
WHERE sp.BusinessEntityID LIKE '2%'
ORDER BY sp.BusinessEntityID, c.LastName;
GO
--INSERT...EXECUTE procedure example
INSERT INTO dbo.EmployeeSales
EXECUTE dbo.uspGetEmployeeSales;
GO
--INSERT...EXECUTE('string') example
INSERT INTO dbo.EmployeeSales
EXECUTE
('
SELECT ''EXEC STRING'', sp.BusinessEntityID, c.LastName,
sp.SalesYTD
FROM Sales.SalesPerson AS sp
INNER JOIN Person.Person AS c
ON sp.BusinessEntityID = c.BusinessEntityID
WHERE sp.BusinessEntityID LIKE ''2%''
ORDER BY sp.BusinessEntityID, c.LastName
');
GO
--Show results.
SELECT DataSource,BusinessEntityID,LastName,SalesDollars
FROM dbo.EmployeeSales;
I. Eklenen verileri tanımlamak için WITH ortak tablo ifadesini kullanma
Aşağıdaki örnek, AdventureWorks2025 veritabanında tabloyu NewEmployee oluşturur. Ortak tablo ifadesi (EmployeeTemp), tabloya eklenecek NewEmployee bir veya daha fazla tablodaki satırları tanımlar. Bu cümle INSERT , ortak tablo ifadesindeki sütunlara referans verir.
CREATE TABLE HumanResources.NewEmployee
(
EmployeeID int NOT NULL,
LastName nvarchar(50) NOT NULL,
FirstName nvarchar(50) NOT NULL,
PhoneNumber Phone NULL,
AddressLine1 nvarchar(60) NOT NULL,
City nvarchar(30) NOT NULL,
State nchar(3) NOT NULL,
PostalCode nvarchar(15) NOT NULL,
CurrentFlag Flag
);
GO
WITH EmployeeTemp (EmpID, LastName, FirstName, Phone,
Address, City, StateProvince,
PostalCode, CurrentFlag)
AS (SELECT
e.BusinessEntityID, c.LastName, c.FirstName, pp.PhoneNumber,
a.AddressLine1, a.City, sp.StateProvinceCode,
a.PostalCode, e.CurrentFlag
FROM HumanResources.Employee e
INNER JOIN Person.BusinessEntityAddress AS bea
ON e.BusinessEntityID = bea.BusinessEntityID
INNER JOIN Person.Address AS a
ON bea.AddressID = a.AddressID
INNER JOIN Person.PersonPhone AS pp
ON e.BusinessEntityID = pp.BusinessEntityID
INNER JOIN Person.StateProvince AS sp
ON a.StateProvinceID = sp.StateProvinceID
INNER JOIN Person.Person as c
ON e.BusinessEntityID = c.BusinessEntityID
)
INSERT INTO HumanResources.NewEmployee
SELECT EmpID, LastName, FirstName, Phone,
Address, City, StateProvince, PostalCode, CurrentFlag
FROM EmployeeTemp;
GO
J. Kaynak tablodan eklenen verileri sınırlamak için TOP kullanma
Aşağıdaki örnek, tabloyu EmployeeSales oluşturur ve AdventureWorks2025 veritabanındaki en iyi 5 rastgele çalışan HumanResources.Employee için isim ve yılbaşından itibaren satış verilerini ekler. Cümle INSERT , ifadenin döndürüp SELECT döndüren 5 satırını seçer. OUTPUT yan tümcesi tabloya EmployeeSales eklenen satırları görüntüler. SELECT deyimindeki ORDER BY yan tümcesinin ilk 5 çalışanı belirlemek için kullanılmadığını görebilirsiniz.
CREATE TABLE dbo.EmployeeSales
( EmployeeID nvarchar(11) NOT NULL,
LastName nvarchar(20) NOT NULL,
FirstName nvarchar(20) NOT NULL,
YearlySales money NOT NULL
);
GO
INSERT TOP(5)INTO dbo.EmployeeSales
OUTPUT inserted.EmployeeID, inserted.FirstName,
inserted.LastName, inserted.YearlySales
SELECT sp.BusinessEntityID, c.LastName, c.FirstName, sp.SalesYTD
FROM Sales.SalesPerson AS sp
INNER JOIN Person.Person AS c
ON sp.BusinessEntityID = c.BusinessEntityID
WHERE sp.SalesYTD > 250000.00
ORDER BY sp.SalesYTD DESC;
Anlamlı bir kronolojik sırayla satır eklemek için TOP kullanmanız gerekiyorsa, aşağıdaki örnekte gösterildiği gibi bir alt seçim deyiminde ORDER BY ile top kullanmanız gerekir. OUTPUT yan tümcesi tabloya EmployeeSales eklenen satırları görüntüler. İlk 5 çalışanın artık rastgele satırlar yerine ORDER BY yan tümcesinin sonuçlarına göre eklendiğine dikkat edin.
INSERT INTO dbo.EmployeeSales
OUTPUT inserted.EmployeeID, inserted.FirstName,
inserted.LastName, inserted.YearlySales
SELECT TOP (5) sp.BusinessEntityID, c.LastName, c.FirstName, sp.SalesYTD
FROM Sales.SalesPerson AS sp
INNER JOIN Person.Person AS c
ON sp.BusinessEntityID = c.BusinessEntityID
WHERE sp.SalesYTD > 250000.00
ORDER BY sp.SalesYTD DESC;
Standart Tablolar Dışında Hedef Nesneleri Belirtme
Bu bölümdeki örneklerde, bir görünüm veya tablo değişkeni belirterek satır ekleme işlemi gösterilmektedir.
K. Görünüm belirterek veri ekleme
Aşağıdaki örnek, hedef nesne olarak bir görünüm adı belirtir; ancak, yeni satır temel alınan temel tabloya eklenir. Deyimindeki INSERT değerlerin sırası görünümün sütun sırasıyla eşleşmelidir. Daha fazla bilgi için bkz . Görünüm Aracılığıyla Verileri Değiştirme.
CREATE TABLE T1 ( column_1 int, column_2 varchar(30));
GO
CREATE VIEW V1 AS
SELECT column_2, column_1
FROM T1;
GO
INSERT INTO V1
VALUES ('Row 1',1);
GO
SELECT column_1, column_2
FROM T1;
GO
SELECT column_1, column_2
FROM V1;
GO
L. Tablo değişkenine veri ekleme
Aşağıdaki örnek, AdventureWorks2025 veritabanında hedef nesne olarak bir tablo değişkenini belirtir.
-- Create the table variable.
DECLARE @MyTableVar table(
LocationID int NOT NULL,
CostRate smallmoney NOT NULL,
NewCostRate AS CostRate * 1.5,
ModifiedDate datetime);
-- Insert values into the table variable.
INSERT INTO @MyTableVar (LocationID, CostRate, ModifiedDate)
SELECT LocationID, CostRate, GETDATE()
FROM Production.Location
WHERE CostRate > 0;
-- View the table variable result set.
SELECT * FROM @MyTableVar;
GO
Uzak Tabloya Satır Ekleme
Bu bölümdeki örneklerde, uzak tabloya başvurmak için bağlı sunucu veya satır kümesi işlevi kullanarak uzak hedef tabloya nasıl satır ekleyebileceğiniz gösterilmektedir.
M. Bağlı sunucu kullanarak uzak tabloya veri ekleme
Aşağıdaki örnek, uzak bir tabloya satır ekler. Örnek, sp_addlinkedserverkullanarak uzak veri kaynağına bir bağlantı oluşturarak başlar.
MyLinkServerbağlı sunucu adı, server.catalog.schema.object biçimindeki dört parçalı nesne adının bir parçası olarak belirtilir.
için geçerlidir: SQL Server 2008 (10.0.x) ve üzeri.
USE master;
GO
-- Create a link to the remote data source.
-- Specify a valid server name for @datasrc as 'server_name'
-- or 'server_nameinstance_name'.
EXEC sp_addlinkedserver @server = N'MyLinkServer',
@srvproduct = N' ',
@provider = N'SQLNCLI',
@datasrc = N'server_name',
@catalog = N'AdventureWorks2022';
GO
-- Specify the remote data source in the FROM clause using a four-part name
-- in the form linked_server.catalog.schema.object.
INSERT INTO MyLinkServer.AdventureWorks2022.HumanResources.Department (Name, GroupName)
VALUES (N'Public Relations', N'Executive General and Administration');
GO
N. OPENQUERY işlevini kullanarak uzak tabloya veri ekleme
Aşağıdaki örnek , OPENQUERY satır kümesi işlevini belirterek uzak tabloya bir satır ekler. Önceki örnekte oluşturulan bağlı sunucu adı bu örnekte kullanılmıştır.
için geçerlidir: SQL Server 2008 (10.0.x) ve üzeri.
INSERT OPENQUERY (MyLinkServer,
'SELECT Name, GroupName
FROM AdventureWorks2022.HumanResources.Department')
VALUES ('Environmental Impact', 'Engineering');
GO
O. OPENDATASOURCE işlevini kullanarak uzak tabloya veri ekleme
Aşağıdaki örnek , OPENDATASOURCE satır kümesi işlevini belirterek uzak tabloya bir satır ekler. server_name veya server_name\instance_namebiçimini kullanarak veri kaynağı için geçerli bir sunucu adı belirtin.
için geçerlidir: SQL Server 2008 (10.0.x) ve üzeri.
-- Use the OPENDATASOURCE function to specify the remote data source.
-- Specify a valid server name for Data Source using the format
-- server_name or server_nameinstance_name.
INSERT INTO OPENDATASOURCE('SQLNCLI',
'Data Source= <server_name>; Integrated Security=SSPI')
.AdventureWorks2022.HumanResources.Department (Name, GroupName)
VALUES (N'Standards and Methods', 'Quality Assurance');
GO
P. PolyBase kullanılarak oluşturulan dış tabloya ekleme
VERILERI SQL Server'dan Hadoop'a veya Azure Depolama'ya aktarın. İlk olarak, hedef dosyaya veya dizine işaret eden bir dış tablo oluşturun. Sonra, INSERT INTO kullanarak yerel bir SQL Server tablosundan harici bir veri kaynağına veri aktarın. INSERT INTO ifadesi, varma dosya veya dizini oluşturur ve SELECT ifadesinin sonuçları belirtilen dosya formatında belirtilen konuma aktarılır. Daha fazla bilgi için bkz. PolyBase'i kullanmaya başlama.
Şunlar için geçerlidir: SQL Server.
-- Create an external table.
CREATE EXTERNAL TABLE [dbo].[FastCustomers2009] (
[FirstName] char(25) NOT NULL,
[LastName] char(25) NOT NULL,
[YearlyIncome] float NULL,
[MaritalStatus] char(1) NOT NULL
)
WITH (
LOCATION='/old_data/2009/customerdata.tbl',
DATA_SOURCE = HadoopHDP2,
FILE_FORMAT = TextFileFormat,
REJECT_TYPE = VALUE,
REJECT_VALUE = 0
);
-- Export data: Move old data to Hadoop while keeping
-- it query-able via external table.
INSERT INTO dbo.FastCustomer2009
SELECT T.* FROM Insured_Customers T1 JOIN CarSensor_Data T2
ON (T1.CustomerKey = T2.CustomerKey)
WHERE T2.YearMeasured = 2009 and T2.Speed > 40;
Tablolardan veya Veri Dosyalarından Toplu Veri Yükleme
Bu bölümdeki örnekler, bu INSERT ifadeyi kullanarak verileri toplu olarak bir tabloya toplamak için iki yöntemi gösterir.
Q. Minimum günlük kaydıyla yığına veri ekleme
Aşağıdaki örnek, yeni bir tablo (yığın) oluşturur ve minimum günlük kaydı kullanarak başka bir tablodan bu tabloya veri ekler. Örnekte veritabanının kurtarma modelinin AdventureWorks2025 FULL olarak ayarlandığı varsayılır. Minimum günlük kullanımını sağlamak için, veritabanının AdventureWorks2025 kurtarma modeli satırlar eklenmeden önce BULK_LOGGED olarak ayarlanır ve INSERT INTO... SELECT ifadesi. Ayrıca, hedef tablo Sales.SalesHistoryiçin TABLOCK ipucu belirtilir. Bu, deyiminin işlem günlüğünde en az alan kullanmasını ve verimli bir şekilde çalışmasını sağlar.
-- Create the target heap.
CREATE TABLE Sales.SalesHistory(
SalesOrderID int NOT NULL,
SalesOrderDetailID int NOT NULL,
CarrierTrackingNumber nvarchar(25) NULL,
OrderQty smallint NOT NULL,
ProductID int NOT NULL,
SpecialOfferID int NOT NULL,
UnitPrice money NOT NULL,
UnitPriceDiscount money NOT NULL,
LineTotal money NOT NULL,
rowguid uniqueidentifier ROWGUIDCOL NOT NULL,
ModifiedDate datetime NOT NULL );
GO
-- Temporarily set the recovery model to BULK_LOGGED.
ALTER DATABASE AdventureWorks2022
SET RECOVERY BULK_LOGGED;
GO
-- Transfer data from Sales.SalesOrderDetail to Sales.SalesHistory
INSERT INTO Sales.SalesHistory WITH (TABLOCK)
(SalesOrderID,
SalesOrderDetailID,
CarrierTrackingNumber,
OrderQty,
ProductID,
SpecialOfferID,
UnitPrice,
UnitPriceDiscount,
LineTotal,
rowguid,
ModifiedDate)
SELECT * FROM Sales.SalesOrderDetail;
GO
-- Reset the recovery model.
ALTER DATABASE AdventureWorks2022
SET RECOVERY FULL;
GO
R. Verileri tabloya toplu yüklemek için BULK ile OPENROWSET işlevini kullanma
Aşağıdaki örnek, OPENROWSET işlevini belirterek bir veri dosyasındaki satırları tabloya ekler. performans iyileştirmesi için IGNORE_TRIGGERS tablo ipucu belirtilir. Daha fazla örnek için Toplu Verileri Kullanarak BULK INSERT İtrak Et veya OPENROWSET(BULK...) (SQL Server) bölümlerine bakınız.
için geçerlidir: SQL Server 2008 (10.0.x) ve üzeri.
INSERT INTO HumanResources.Department WITH (IGNORE_TRIGGERS) (Name, GroupName)
SELECT b.Name, b.GroupName
FROM OPENROWSET (
BULK 'C:SQLFilesDepartmentData.txt',
FORMATFILE = 'C:SQLFilesBulkloadFormatFile.xml',
ROWS_PER_BATCH = 15000)AS b ;
İpuçları Kullanarak Sorgu İyileştiricisinin Varsayılan Davranışını Geçersiz Kılma
Bu bölümdeki örnekler, tablo ipuçlarının kullanılarak sorgu optimizatorunun varsayılan davranışını geçici olarak nasıl INSERT geçersiz kılacağınızı gösterir.
Caution
SQL Server sorgu iyileştiricisi genellikle sorgu için en iyi yürütme planını seçtiğinden, ipuçlarının yalnızca deneyimli geliştiriciler ve veritabanı yöneticileri tarafından son çare olarak kullanılmasını öneririz.
S. Kilitleme yöntemi belirtmek için TABLOCK ipucunu kullanma
Aşağıdaki örnek, Production.Location tablosunda özel (X) kilidin alındığını ve ifadenin INSERT sonuna kadar tutulduğunu belirtir.
Şunlar için geçerlidir: SQL Server, SQL Veritabanı.
INSERT INTO Production.Location WITH (XLOCK)
(Name, CostRate, Availability)
VALUES ( N'Final Inventory', 15.00, 80.00);
Açıklamanın INSERT Sonuçlarını Yakalamak
Bu bölümdeki örnekler, OUTPUT Clause'un bir ifadeden etkilenen INSERT her satırdan bilgi veya ifadeler nasıl döndürüleceğini gösterir. Bu sonuçlar, onay iletileri, arşivleme ve diğer uygulama gereksinimleri gibi durumlarda kullanılmak üzere işleme uygulamasına döndürülebilir.
T. OUTPUT ile bir INSERT ifadeyi kullanmak
Aşağıdaki örnek tabloya ScrapReason bir satır ekler ve deyiminin OUTPUT sonuçlarını tablo değişkenine döndürmek için yan tümcesini @MyTableVar kullanır. Sütun bir ScrapReasonID özellik ile tanımlandığındanIDENTITY, bu sütunun INSERT deyiminde bir değer belirtilmez. Ancak, bu sütun için Veritabanı Altyapısı tarafından oluşturulan değerin sütundaki OUTPUT yan tümcesinde INSERTED.ScrapReasonID döndürüldüğünü unutmayın.
DECLARE @MyTableVar table( NewScrapReasonID smallint,
Name varchar(50),
ModifiedDate datetime);
INSERT Production.ScrapReason
OUTPUT INSERTED.ScrapReasonID, INSERTED.Name, INSERTED.ModifiedDate
INTO @MyTableVar
VALUES (N'Operator error', GETDATE());
--Display the result set of the table variable.
SELECT NewScrapReasonID, Name, ModifiedDate FROM @MyTableVar;
--Display the result set of the table.
SELECT ScrapReasonID, Name, ModifiedDate
FROM Production.ScrapReason;
U. Kimlik ve hesaplanan sütunlarla OUTPUT kullanma
Aşağıdaki örnek, tabloyu EmployeeSales oluşturur ve ardından kaynak tablolardan veri almak için SELECT ifadesi içeren bir INSERT ifade kullanarak birkaç satır ekler. Tabloda EmployeeSales bir kimlik sütunu (EmployeeID) ve hesaplanan sütun (ProjectedSales) bulunur. Bu değerler ekleme işlemi sırasında Veritabanı Altyapısı tarafından oluşturulduğundan, bu sütunların hiçbiri içinde @MyTableVartanımlanamaz.
CREATE TABLE dbo.EmployeeSales
( EmployeeID int IDENTITY (1,5)NOT NULL,
LastName nvarchar(20) NOT NULL,
FirstName nvarchar(20) NOT NULL,
CurrentSales money NOT NULL,
ProjectedSales AS CurrentSales * 1.10
);
GO
DECLARE @MyTableVar table(
LastName nvarchar(20) NOT NULL,
FirstName nvarchar(20) NOT NULL,
CurrentSales money NOT NULL
);
INSERT INTO dbo.EmployeeSales (LastName, FirstName, CurrentSales)
OUTPUT INSERTED.LastName,
INSERTED.FirstName,
INSERTED.CurrentSales
INTO @MyTableVar
SELECT c.LastName, c.FirstName, sp.SalesYTD
FROM Sales.SalesPerson AS sp
INNER JOIN Person.Person AS c
ON sp.BusinessEntityID = c.BusinessEntityID
WHERE sp.BusinessEntityID LIKE '2%'
ORDER BY c.LastName, c.FirstName;
SELECT LastName, FirstName, CurrentSales
FROM @MyTableVar;
GO
SELECT EmployeeID, LastName, FirstName, CurrentSales, ProjectedSales
FROM dbo.EmployeeSales;
V. OUTPUT yan tümcesinden döndürülen verileri ekleme
Aşağıdaki örnek, bir MERGE ifadenin OUTPUT maddesinden geri dönen verileri yakalar ve bu verileri başka bir tabloya ekler. Bu MERGE açıklama, AdventureWorks2025 veritabanında tabloda işlenen SalesOrderDetail siparişlere göre tablonun ProductInventory sütununu günlük olarak güncellerQuantity. Ayrıca envanterleri 0'a düşen ürünlerin satırlarını da siler. Örnek, silinen satırları yakalar ve stok içermeyen ürünleri izleyen başka bir tabloya ZeroInventoryekler.
--Create ZeroInventory table.
CREATE TABLE Production.ZeroInventory (DeletedProductID int, RemovedOnDate DateTime);
GO
INSERT INTO Production.ZeroInventory (DeletedProductID, RemovedOnDate)
SELECT ProductID, GETDATE()
FROM
( MERGE Production.ProductInventory AS pi
USING (SELECT ProductID, SUM(OrderQty) FROM Sales.SalesOrderDetail AS sod
JOIN Sales.SalesOrderHeader AS soh
ON sod.SalesOrderID = soh.SalesOrderID
AND soh.OrderDate = '20070401'
GROUP BY ProductID) AS src (ProductID, OrderQty)
ON (pi.ProductID = src.ProductID)
WHEN MATCHED AND pi.Quantity - src.OrderQty <= 0
THEN DELETE
WHEN MATCHED
THEN UPDATE SET pi.Quantity = pi.Quantity - src.OrderQty
OUTPUT $action, deleted.ProductID) AS Changes (Action, ProductID)
WHERE Action = 'DELETE';
IF @@ROWCOUNT = 0
PRINT 'Warning: No rows were inserted';
GO
SELECT DeletedProductID, RemovedOnDate FROM Production.ZeroInventory;
W. SELECT seçeneğini kullanarak veri ekleme
Aşağıdaki örnek, SELECT seçeneğiyle bir INSERT ifade kullanarak birden fazla veri satırının nasıl ekleneceğini gösterir. İlk INSERT deyim, kaynak tablodan veri almak ve ardından sonuç kümesini SELECT tabloda depolamak için doğrudan bir EmployeeTitles deyim kullanır.
CREATE TABLE EmployeeTitles
( EmployeeKey INT NOT NULL,
LastName varchar(40) NOT NULL,
Title varchar(50) NOT NULL
);
INSERT INTO EmployeeTitles
SELECT EmployeeKey, LastName, Title
FROM ssawPDW.dbo.DimEmployee
WHERE EndDate IS NULL;
X. Şu ifadeyle INSERT bir etiket belirtmek
Aşağıdaki örnek, bir INSERT ifadeyle etiket kullanımını göstermektedir.
-- Uses AdventureWorks
INSERT INTO DimCurrency
VALUES (500, N'C1', N'Currency1')
OPTION ( LABEL = N'label1' );
Y. Bir etiket ve bir sorgu ipucu kullanarak bu INSERT ifadeyle
Bu sorgu, bir etiket ve bir sorgu birleştirme ipucu ile INSERT birlikte kullanılmak için temel sözdizimi gösterilir. Sorgu Denetim düğümüne gönderildikten sonra, İşlem düğümlerinde çalışan SQL Server, SQL Server sorgu planını oluşturduğunda karma birleştirme stratejisini uygular. Birleştirme ipuçları ve OPTION yan tümcesini kullanma hakkında daha fazla bilgi için bkz. OPTION (SQL Server PDW).
-- Uses AdventureWorks
INSERT INTO DimCustomer (CustomerKey, CustomerAlternateKey,
FirstName, MiddleName, LastName )
SELECT ProspectiveBuyerKey, ProspectAlternateKey,
FirstName, MiddleName, LastName
FROM ProspectiveBuyer p JOIN DimGeography g ON p.PostalCode = g.PostalCode
WHERE g.CountryRegionCode = 'FR'
OPTION ( LABEL = 'Add French Prospects', HASH JOIN);
Ayrıca Bkz.
BULK INSERT (Transact-SQL)
DELETE (Transact-SQL)
ÇALIŞTIR (Transact-SQL)
FROM (Transact-SQL)
IDENTITY (Özellik) (Transact-SQL)
NEWID (Transact-SQL)
SEÇ (Transact-SQL)
UPDATE (Transact-SQL)
MERGE (Transact-SQL)
OUTPUT Yan Tümcesi (Transact-SQL)
Eklenen ve silinen Tabloları kullanma