Aracılığıyla paylaş


INSERT (Transact-SQL)

Şunlar için geçerlidir:SQL ServerAzure SQL VeritabanıAzure SQL Yönetilen ÖrneğiAzure Synapse AnalyticsAnaliz 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ı

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>
INSERT deyimi kapsamında tanımlanan ve ortak tablo ifadesi olarak da bilinen geçici adlandırılmış sonuç kümesini belirtir. 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
INSERT ile hedef tablo arasında 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.

Bir tablo değişkeni, kapsamı içinde bir INSERT deyiminde 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, çok tablolu bir görünüme INSERT, yalnızca bir temel tablodaki sütunlara başvuran bir column_list kullanmalıdır. Güncelleştirilebilir 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

INSERT deyimlerinin hedefi olan tablolarda HOLDLOCK, SERIALIZABLE, READCOMMITTED, REPEATABLEREAD veya UPDLOCK ipuçlarını belirtme özelliği, SQL Server'ın gelecekteki bir sürümünde kaldırılacaktır. Bu ipuçları INSERT deyimlerinin 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.

INSERT deyiminin hedefi olan bir tabloda TABLOCK ipucunun belirtilmesi, TABLOCKX ipucunu belirtmeyle 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:

  • IDENTITY özelliğine sahiptir. 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 bir kimlik sütununa açık değerler eklendiğinde ve tablo için SET IDENTITY_INSERT seçeneği AÇIK olduğunda kullanılmalı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 yan tümcesi, yerel bölümlenmiş görünümlere, dağıtılmış bölümlenmiş görünümlere veya uzak tablolara ya da execute_statement içeren INSERT deyimlerine başvuran DML deyimlerinde desteklenmez. OUTPUT INTO yan tümcesi, dml_table_source< yan tümcesi içeren >INSERT deyimlerinde desteklenmez. 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.

Tek bir INSERT deyiminde birden çok satır belirtmek için Transact-SQL satır oluşturucuyu (tablo değeri oluşturucu olarak da adlandırılır) 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 deyiminin RESULT SETS seçenekleri insert... içinde belirtilemez. EXEC deyimi.

INSERT ile execute_statement kullanılıyorsa, her sonuç kümesinin tablodaki veya column_list sütunlarla uyumlu olması gerekir.

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.

Insert EXEC deyiminin hedefi olarak tablo değerli parametre belirtemezsiniz; ancak, INSERT EXEC dizesinde veya saklı yordamda kaynak olarak belirtilebilir. Daha fazla bilgi için bkz . Table-Valued Parametreleri (Veritabanı Altyapısı) kullanma.

<dml_table_source>
Hedef tabloya eklenen satırların, isteğe bağlı olarak WHERE yan tümcesi tarafından filtrelenen INSERT, UPDATE, DELETE veya MERGE deyiminin OUTPUT yan tümcesi tarafından döndürülen satırlar olduğunu belirtir. dml_table_source< belirtilirse>, dış INSERT deyiminin 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 yan tümcesinde etkilenen satırları döndüren geçerli bir INSERT, UPDATE, DELETE veya MERGE deyimidir. deyimi bir WITH yan tümcesi içeremez ve uzak tabloları veya bölümlenmiş görünümleri hedefleyemez. UPDATE veya DELETE belirtilirse, imleç tabanlı bir UPDATE veya DELETE olamaz. 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.

VARSAYıLAN 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 graf tablolarına veri eklemeye özgü bilgiler için bkz. INSERT (SQL Graph).

MAXDOP sorgu ipucu, INSERT SELECT işlemleri sırasında SELECT kısmı harici kaynaklardan okunduğunda desteklenmez.

En İyi Yöntemler

İstemci uygulamasına eklenen satır sayısını döndürmek için @@ROWCOUNT işlevini kullanın. Daha fazla bilgi için bkz. @@ROWCOUNT (Transact-SQL).

Verileri Toplu İçeri Aktarma için En İyi Yöntemler

INSERT INTO kullanılıyor... Select to Bulk Import data with minimal logging and parallelism

Ç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 TABLOCK hedef tablo için belirtilir.

MERGE deyimindeki bir ekleme eyleminin sonucu olarak bir yığına eklenen satırlar da en az günlüğe 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 IDENTITY_INSERT OFF olarak ayarlanmış bir kimlik sütunu yok.
  • İpucu TABLOCK hedef 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 Ambarınız üzerinde INSERT kullanma hakkında daha fazla bilgi için bkz. Transact-SQL kullanarak Verileri Ambarınıza alma.

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 işlevi, INSERT deyimiyle toplu yük iyileştirmeleri sağlayan aşağıdaki tablo ipuçlarını kabul edebilir:

  • İpucu, TABLOCK ekleme 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 TABLOCK ekleme 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_CONSTRAINTS FOREIGN KEY ve CHECK kısıtlama denetimini geçici olarak devre dışı bırakabilir.
  • İpucu IGNORE_TRIGGERS tetikleyici yürütmeyi geçici olarak devre dışı bırakabilir.
  • İpucu, KEEPDEFAULTS veri kaydında sütun için değer olmadığında tablo sütununun varsayılan değerinin (varsa) NULL yerine eklenmesine izin verir.
  • İpucu, KEEPIDENTITY iç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 karakter, varchar veya varbinary veri türüne sahip sütunlara yükleniyorsa, sondaki boşlukların ( karakter ve varchar için boşluklar, varbinary için sıfırlar) doldurulması veya kesilmesi, tablo oluşturulduğunda sütun için tanımlanan SET ANSI_PADDING ayarı tarafından belirlenir. Daha fazla bilgi için bkz. SET ANSI_PADDING (Transact-SQL).

    Aşağıdaki tabloda SET ANSI_PADDING OFF için varsayılan işlem gösterilmektedir.

    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 tabloya Point eklemek için kullanıcı tanımlı bir işlev Cities kullanır.

    INSERT INTO Cities (Location)  
    VALUES ( dbo.CreateNewPoint(x, y) );  
    

Hata İşleme

TRY içinde deyimini belirterek INSERT deyimi için hata işleme uygulayabilirsiniz... CATCH yapısı.

INSERT deyimi bir kısıtlamayı veya kuralı ihlal ederse veya sütunun veri türüyle uyumlu olmayan bir değere sahipse, deyimi başarısız olur ve bir hata iletisi döndürülür.

INSERT SELECT veya EXECUTE ile birden çok satır yüklüyorsa, yüklenen değerlerden oluşan bir kural veya kısıtlama ihlali deyiminin durdurulmasını sağlar ve hiçbir satır yüklenmez.

Bir INSERT deyimi, ifade değerlendirmesi sırasında oluşan bir aritmetik hatayla (taşma, sıfıra bölme veya etki alanı hatası) karşılaştığında, Veritabanı Altyapısı BU hataları SET ARITHABORT ON olarak ayarlanmış gibi işler. Toplu iş durdurulur ve bir hata iletisi döndürülür. SET ARITHABORT ve SET ANSI_WARNINGS KAPALI olduğunda ifade değerlendirmesi sırasında, INSERT, DELETE veya UPDATE deyimi aritmetik bir hata, taşma, sıfıra bölme veya etki alanı hatasıyla karşılaşırsa, SQL Server NULL değeri ekler veya güncelleştirir. 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 tablo veya görünüme karşı INSERT eylemleri üzerinde bir INSTEAD OF tetikleyici tanımlandığında, tetikleyici INSERT deyimi yerine yürütülür. Tetikleyiciler hakkında INSTEAD OF daha fazla bilgi için bkz. CREATE TRIGGER (Transact-SQL).

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.

INSERT ile TOP kullanıldığında, başvuruda bulunılan satırlar herhangi bir sırada düzenlenmez ve ORDER BY yan tümcesi bu deyimlerde doğrudan belirtilmez. 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.

Satırları doldurmak için ORDER BY ile SELECT kullanan INSERT sorguları, kimlik değerlerinin nasıl hesaplandığını garanti eder ancak satırların eklenme sırasını garanti eder.

Paralel Veri Ambarı'nda ORDER BY yan tümcesi, TOP belirtilmediği sürece VIEWS, CREATE TABLE AS SELECT, INSERT SELECT, satır içi işlevler, türetilmiş tablolar, alt sorgular ve ortak tablo ifadelerinde geçersizdir.

Kayıt Davranışı

INSERT deyimi, BULK anahtar sözcüğüyle OPENROWSET işlevinin kullanılması veya kullanılması INSERT INTO <target_table> SELECT <columns> FROM <source_table>dışında her zaman tam olarak günlüğe kaydedilir. 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 BULK INSERT veya OPENROWSET(BULK...) (SQL Server) Kullanarak Toplu Verileri İçeri Aktarma konusunda "GüvenlikLe İlgili Önemli Noktalar" bölümüne bakın.

Permissions

Hedef tabloda INSERT izni gereklidir.

INSERT izinleri varsayılan olarak sabit sunucu rolünün sysadmin üyeleri, db_owner ve db_datawriter sabit veritabanı rolleri ve tablo sahibidir. sysadmin, db_ownerve db_securityadmin rollerinin üyeleri ve tablo sahibi izinleri diğer kullanıcılara aktarabilir.

INSERT'i OPENROWSET işlevi BULK seçeneğiyle yürütmek için sabit sunucu rolünün sysadmin veya sabit sunucu rolünün bulkadmin ü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 SOKMAK... SEÇ * EKLE... EXECUTE * WITH common table expression * TOP * OFFSET FETCH
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 SOKMAK... SELECT * OPENROWSET işlevi
İpuçlarını kullanarak sorgu iyileştiricisinin varsayılan davranışını geçersiz kılma Tablo ipuçları
INSERT deyiminin sonuçlarını yakalama OUTPUT cümlesi

Temel Söz Dizimi

Bu bölümdeki örnekler, gerekli en düşük söz dizimini kullanarak INSERT deyiminin temel işlevselliğini gösterir.

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 tabloya tek bir INSERT ifadesinde üç satır Production.UnitMeasure 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 örneklerde, IDENTITY özelliği, DEFAULT değeri ile tanımlanan veya uniqueidentifier veya kullanıcı tanımlı tür sütunları gibi veri türleriyle tanımlanan sütunlara değer ekleme yöntemleri gösterilmektedir.

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. INSERT deyimleri, bazı sütunlar için değer içeren ancak tümünü içermeyen satırlar ekler. Son INSERT deyiminde sütun belirtilmez ve DEFAULT VALUES yan tümcesi kullanılarak yalnızca varsayılan değerler 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 deyimi, yeni satırlar için kimlik değerlerinin oluşturulmasına izin verir. Üçüncü INSERT deyimi, SET IDENTITY_INSERT deyimiyle sütunun IDENTITY özelliğini 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 örnekte INSERT kullanarak bir tablodan başka bir tabloya veri ekleme işlemi gösterilmektedir... SELECT veya INSERT... YÜRÜTMEK. Her biri, sütun listesinde bir ifade ve değişmez değer içeren çok tablolu SELECT deyimini temel alır.

İlk INSERT ifadesi, AdventureWorks2025 veritabanındaki kaynak tablolardan (Employee, , ve Person) verileri türetmek ve sonuç kümesini EmployeeSales tabloda saklamak için SELECT ifadesi SalesPersonkullanır. İkinci INSERT deyimi, SELECT deyimini içeren saklı yordamı çağırmak için EXECUTE yan tümcesini, üçüncü INSERT ise SELECT deyimine değişmez değer dizesi olarak başvurmak için EXECUTE yan tümcesini kullanır.

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. INSERT deyimi ortak tablo ifadesindeki sütunlara başvurur.

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. INSERT deyimi, deyimi tarafından SELECT döndürülen 5 satırı 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. Ardından, yerel SQL Server tablosundaki verileri dış veri kaynağına aktarmak için INSERT INTO kullanın. INSERT INTO deyimi, mevcut değilse hedef dosyayı veya dizini oluşturur ve SELECT deyiminin sonuçları belirtilen dosya biçiminde 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 örneklerde INSERT deyimini kullanarak verileri bir tabloya toplu olarak yüklemek için iki yöntem gösterilmektedir.

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 kaydının kullanıldığından emin olmak için, satırlar eklenmeden önce veritabanının AdventureWorks2025 kurtarma modeli BULK_LOGGED olarak ayarlanır ve INSERT INTO... SELECT deyimi. 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 bkz . BULK INSERT veya OPENROWSET(BULK...) (SQL Server) Kullanarak Toplu Verileri İçeri Aktarma.

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 örneklerde, INSERT deyimi işlenirken sorgu iyileştiricisinin varsayılan davranışını geçici olarak geçersiz kılmak için tablo ipuçlarının nasıl kullanılacağı gösterilmektedir.

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) bir kilidin alındığını ve INSERT deyiminin 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);  

INSERT Deyiminin Sonuçlarını Yakalama

Bu bölümdeki örneklerde, INSERT deyiminden etkilenen her satırdan bilgi döndürmek için OUTPUT Yan Tümcesi'nin nasıl kullanılacağı gösterilmektedir. 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'i INSERT deyimiyle kullanma

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 oluşturur EmployeeSales ve sonra kaynak tablolardan veri almak için SELECT deyimine sahip bir INSERT deyimi kullanarak içine 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, MERGE deyiminin OUTPUT yan tümcesinden döndürülen verileri yakalar ve bu verileri başka bir tabloya ekler. MERGE beyanı, AdventureWorks2025 veritabanındaki 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 örnekte, SELECT seçeneğiyle insert deyimi kullanarak birden çok veri satırı ekleme işlemi gösterilmektedir. İ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. INSERT deyimiyle etiket belirtme

Aşağıdaki örnekte INSERT deyimiyle etiket kullanımı gösterilmektedir.

-- Uses AdventureWorks  
  
INSERT INTO DimCurrency   
VALUES (500, N'C1', N'Currency1')  
OPTION ( LABEL = N'label1' );  

Y. INSERT deyimiyle etiket ve sorgu ipucu kullanma

Bu sorgu, INSERT deyimiyle etiket ve sorgu birleştirme ipucu kullanmaya yönelik temel söz dizimini gösterir. 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.

TOPLU INSERT (Transact-SQL)
SILME (Transact-SQL)
ÇALIŞTIR (Transact-SQL)
FROM (Transact-SQL)
IDENTITY (Özellik) (Transact-SQL)
NEWID (Transact-SQL)
SEÇ (Transact-SQL)
GÜNCELLEME (Transact-SQL)
BIRLEŞME (Transact-SQL)
OUTPUT Yan Tümcesi (Transact-SQL)
Eklenen ve silinen Tabloları kullanma