Ekle (Transact-SQL)

Bir veya daha çok yeni satır, bir tablo veya Görünüm ekler.Örnekler için bkz: Örnekler (Transact-SQL) INSERT.

Topic link iconTransact-SQL sözdizimi kuralları

[ 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 ] ) ]

Bağımsız değişkenler

  • > < Common_table_expression
    Sonuç olarak adlandırılan geçici belirtir küme, INSERT ifadeinin kapsam içinde tanımlanan ortak tablo ifade olarak da bilinir.Sonuç kümesi deyim türetilir.

    Ortak tablo ifadeler, SELECT, DELETE, UPDATE ve CREATE VIEW ekstreleri de kullanılabilir.Daha fazla bilgi için bkz:WITH common_table_expression (Transact-SQL).

  • TOP ( expression ) [%]
    Specifies the number or percent of random rows that will be inserted.expression can be either a number or a percent of the rows.Kullanılan INSERT, UPDATE veya DELETE TOP ifadesinde başvurulan satırları herhangi bir sırada düzenlenirler.

    Sınırlayan parantez expression TOP INSERT, UPDATE ve DELETE deyimlerinde gereklidir. Daha fazla bilgi için bkz:TOP (Transact-SQL).

  • İÇİNE
    Ekle ve hedef tablo arasında kullanılan isteğe bağlı bir anahtar sözcük olarak belirtilir.

  • server_name
    Is the name of the linked server on which the table or view is located.server_name can be specified as a linked server name, or by using the OPENDATASOURCE function.

    Ne zaman server_name bağlantılı sunucu belirtilir database_name ve schema_name gereklidir. Ne zaman server_name OPENDATASOURCE ile belirtilen database_name ve schema_name tüm veri kaynakları için geçerli olabilir ve uzak nesne erişen bir OLE DB sağlayıcı yeteneklerini tabi olur. Daha fazla bilgi için bkz:Dağıtılmış sorgular.

  • database_name
    Veritabanının adıdır.

  • schema_name
    Hangi şema adı tablo veya görünüme ait.

  • table_or view_name
    Tablo veya Görünüm veriyi alacak olan adıdır.

    C Tablo değişkeni, bir kapsam içinde bir tablo olarak kullanılan kaynak bir INSERT deyimnde.

    Tarafından başvuruda bulunulan görünümü table_or_view_name yükl olmalıdır tablo ve tam olarak bir temel tablo görünümünün FROM yan tümcesinde. Örneğin, bir çok içine INSERT tablo görünümü kullanmalısınız bir column_list Sütunlar yalnızca, bir temel başvuruyor tablo. Güncelleştirilebilir görünümler hakkında daha fazla bilgi için bkz: VIEW (Transact-SQL) CREATE.

  • rowset_function_limited
    Ya da iş openquery or openrowset işlev.Bu işlevler uzak nesne erişen bir OLE DB sağlayıcı yeteneklerine bağlı olarak kullanılır.Daha fazla bilgi için bkz:Dağıtılmış sorgular.

  • (< Table_hint_limited >...n )
    Hedef tablo için izin verilen bir veya daha fazla tablo ipuçları belirtir.WITH anahtar sözcüğünü ve ayraçlar gereklidir.

    READPAST, NOLOCK ve READUNCOMMITTED izin verilmez.Tablo ipuçları hakkında daha fazla bilgi için bkz: Tablo ipuçları (Transact-SQL).

    Important noteImportant Note:

    INSERT deyimleri hedefi olan tablolarda HOLDLOCK, SERIALIZABLE READCOMMITTED REPEATABLEREAD veya UPDLOCK ipuçları belirtme yeteneği, gelecekteki bir sürümüne kaldırılacaktır. SQL Server. Bu ipuçları, INSERT deyimleri performansını etkilemez.Bunları yeni geliştirme iş kullanmaktan kaçının ve onları kullanan uygulamalar değiştirmek planlama.

    TABLOCK belirtme ipucu bir tablo olan hedefi olan bir INSERT deyim TABLOCKX ipucu belirtme aynı etkiye sahiptir.Özel bir kilit, tablo üzerinde alınır.

  • ( column_list )
    Is a list of one or more columns in which to insert data.column_list must be enclosed in parentheses and delimited by commas.

    Bir sütun içinde değilse column_list, Database Engine sağlamak sağlayabilmelisiniz sütunun tanımına bir değer alarak; aksi halde, satır yüklenemiyor. The Database Engine automatically provides a value for the sütun if the sütun:

    • Bir IDENTITY özelliğine sahiptir.Sonraki artımlı bir kimlik değeri kullanılır.

    • Varsayılan olarak sahiptir.Sütun için varsayılan değer kullanılır.

    • Sahip bir timestamp veri türü. Geçerli zaman damgası değeri kullanılır.

    • Null.null değer kullanılır.

    • hesaplanan sütun belirtilir.Hesaplanan değeri kullanılır.

    column_list ve bir değerler listesi kullanılmalıdır, açık değerler kimlik sütun olarak eklenir ve küme ıdentıty_ınsert seçeneği, tablo için AÇıK olması gerekir.

  • OUTPUT yan tümce
    Verir, satır ekleme işleminin bir parçası olarak eklenir.sonuçlar işleme uygulamaya döndürdü veya eklenen bir tablo ya da daha fazla işlemek için bir tablo değişkeni kullanabilirsiniz.

    The OUTPUT yan tümce is not supported in DML statements that reference local partitioned views, distributed partitioned views, or remote tables, or INSERT statements that contain an execute_statement. OUTPUT INTO yan tümce içeren INSERT deyimleri desteklenen bir <dml_table_source> yan tümce.

  • VALUES
    Liste veya eklenecek veri değerlerinin bir listesini sunar.Her sütun için bir veri değeri olmalıdır column_list, belirtilen veya içinde tablo. Değer listesi, parantez içine alınmalıdır.

    Değer listesindeki değerlerin sütunlarda aynı sırada değilse, tablo veya her sütun için bir değer yoksa tablo, column_list açıkça gelen her değere saklayan bir sütun belirtmek için kullanılmalıdır.

    SQL Server 2008 tanıtır Transact-SQL birden çok satırı tek bir INSERT deyim belirtmek için (bir Tablo değeri kurucusu olarak da bilinir) bir kurucu satır. Satır kurucu parantez içine alınmış ve virgülle ayrılmış birden çok değer listeleri tek bir VALUES yan tümce içerir.Bkz: "tek bir INSERT kullanarak birden çok satır eklemeyi deyim" kısmında yer alan açıklamalar.

  • VARSAYILAN
    Zorlar Database Engine bir sütun için tanımlanan varsayılan değeri'ni yüklemek için . Sütun için varsayılan izin yok ve sütunun boş değerlere izin, NULL eklenir.Ile tanımlanmış bir sütun için timestamp veri türü, sonraki zaman damgası değeri eklenir. VARSAYıLAN kimlik sütun için girilen değer geçerli değil.

  • expression
    Bir sabit, değişken veya ifade belirtilir.ifade bir yürütmek ifade içeremez.

    Unicode karakter veri türlerini başvururken nchar, nvarchar, ve ntext, 'ifade' büyük harfle öneki 'n '.'N' belirtilmedi, SQL Server dizeye dönüştürür kod sayfa, veritabanı veya sütun için varsayılan harmanlama karşılık gelir. Bu kod sayfasında bulunmayan tüm karakterler büyük/küçük harf kaybolur.Daha fazla bilgi için bkz:Unicode ile sunucu tarafı programlama.

  • derived_table
    Içine yüklenecek veri satırları döndüren geçerli bir deyim mi tablo.ifade, ortak bir tablo ifade (CTE) içeremez.

  • execute_statement
    READTEXT ya da SELECT deyimleriyle ilgili verileri döndürür herhangi bir geçerli yürütmek deyim belirtilir.

    If execute_statement kullanılan INSERT ile her bir sonuç kümesi içindeki sütunları ile uyumlu olmalıdır tablo veya column_list.

    execute_statement saklı yordamlar, aynı sunucu veya bir uzak sunucuda yürütmek için kullanılır.Uzak sunucu yordamında yürütülür ve sonuç kümelerini yerel sunucuya döndürdü ve yüklenen tablo yerel sunucudaki.Dağıtılmış işleme execute_statement Bağlantı etkin birden çok etkin bir sonuç kümesi (MARS) olduğunda, geri döngü bağlı sunucuda verilemez.

    If execute_statement returns data with the READTEXT statement, each READTEXT statement can return a maximum of 1 MB (1024 KB) of data.execute_statement can also be used with extended procedures.execute_statement inserts the data returned by the main thread of the extended procedure; however, output from threads other than the main thread are not inserted.

    Bir INSERT EXEC hedefi olarak bir tablo değerli bir parametre belirtilemez deyim; ancak, bir saklı yordam veya INSERT EXEC dizesini kaynağı olarak belirtilebilir.Daha fazla bilgi için bkz:Tablo biçiminde Parametreler (Veritabanı Altyapısı).

  • <dml_table_source>
    Satırlar hedef tabloya eklenen isteğe bağlı olarak bir WHERE yan tümce göre süzülmüş bir INSERT, UPDATE, DELETE veya BIRLEŞTIRME deyimini OUTPUT yan tümce tarafından döndürülen olduğunu belirtir.If <dml_table_source> belirtilen hedef dış olan INSERT deyim aşağıdaki kısıtlamalar karşılaması gerekir:

    • Bu işlem, temel tablo, bir görünümü olmalıdır.

    • Bu işlem bir uzak tablo olamaz.

    • Bu, herhangi bir tetikleyici tanımlanmış olamaz.

    • Bu, birincil bir anahtar yabancı anahtar ilişkileri alamaz.

    • Birleştirme çoğaltma veya işlem çoğaltma için güncelleştirilebilir abonelikler katılamaz.

    Veritabanının uyumluluk düzey, 100'e küme olmalıdır.Daha fazla bilgi için 'Eklemek veri kaynağı bir OUTPUT yan tümce ınto bir hedef tablo' Açıklamalar bölümüne bakın.

  • <select_list>
    Hangi sütunların ÇıKTıSı tarafından döndürülen belirtme, virgülle ayrılmış bir liste mi yan tümce eklemek.The columns in <select_list> must be compatible with the columns into which values are being inserted.<select_list> cannot reference aggregate functions or TEXTPTR.

    Not

    SELECT listesinde listelenen tüm değişkenleri özgün değerlerine, bunları yapılan değişiklikler ne olursa olsun başvurun... <dml_statement_with_output_clause>.

  • <dml_statement_with_output_clause>
    Geçerli bir INSERT, UPDATE, DELETE mi ya da etkilenen işlevi BIRLEŞTIRME deyim içinde bir OUTPUT satırları yan tümce.Deyim bir WITH yan tümcesini içeremez ve uzak tablo veya bölümlendirilmiş görünümlerde hedefleyemez.UPDATE veya DELETE belirtilirse, bir imleç tabanlı UPDATE olamaz veya DELETE.Kaynak satırları, iç içe geçmiş DML deyimlerini başvurulamaz.

  • WHERE search_condition < >
    Herhangi bir WHERE yan tümcesini geçerli bir içeren iş <search_condition> döndürülen satırları, filtre uygular <dml_statement_with_output_clause>. Daha fazla bilgi için bkz:Arama koşulu (Transact-SQL).Bu bağlamda kullanılan <search_condition> alt sorgular, veri erişimi, toplamak işlevlerinin TEXTPTR ya da tam metin araması yüklemler skaler kullanıcı tanımlı işlevler içeremez.

  • VARSAYILAN DEĞERLER
    Güçleri, her sütun için varsayılan değerleri içeren yeni bir satır tanımlı.

Toplu yükleme verileri için en iyi uygulamalar

INSERT INTO…SELECT toplu yükleme veriye sahip en az bir günlük kullanarak

INSERT INTO kullanabilirsiniz <target_table> SEÇİN <sütunları> GELEN <source_table> verimli bir şekilde çok sayıda satır basamaklandırma bir tablo gibi bir tablodan başka bir tabloya en az bir günlük kaydı ile aktarmak için . En az bir günlük deyim performansını ve hareket sırasında kullanılabilir işlem günlük alanı doldurma işlemi olasılığını azaltır.

Bu oturum en az deyim aşağıdaki gereksinimler vardır:

  • Veritabanının kurtarma modeli küme basit veya toplu oturum.

  • Hedef tablo boş veya boş olmayan bir yığın olur.

  • Hedef Tablo içinde kullanılan çoğaltma.

  • TABLOCK ipucu için hedef tablo adı belirtilmedi.

Bir yığın ekleme eylem BIRLEŞTIRME deyimindeki bir sonucu olarak eklenen satırlar da en az günlüğe kaydedilebilir.

Daha az kısıtlayıcı bir toplu güncelleştirme kilit tutan, BULK INSERT deyim, INSERT INTO…SELECT TABLOCK ipucu ile tablo üzerinde bir Özel (X) kilit tutar.Bunun anlamı, paralel ekleme işlemlerini kullanarak satır eklenemiyor.Kilitlerin hakkında daha fazla bilgi için bkz: Kilit modu.

OPENROWSET ve toplu yükleme Data toplu kullanarak

OPENROWSET işlevini aşağıdaki kabul edebileceği tablo toplu yükleme en iyi duruma getirmeleri INSERT deyim ile sağlayan ipuçları:

  • TABLOCK ipucu ekleme işlemi için günlüğü kayıtlarının sayısını en aza indirebilirsiniz.Veritabanının kurtarma modeli basit veya toplu oturum ayarlanmalıdır ve hedef tablo çoğaltmasında kullanılır.Daha fazla bilgi için bkz:Toplu alma en az günlüğe kaydetme için Önkoşullar.

  • IGNORE_CONSTRAINTS ipucu geçici olarak yabancı anahtar ve CHECK kısıtlaması denetimini devre dışı bırakabilirsiniz.

  • Ignore_trıggers ipucu tetikleyicisi yürütme geçici olarak devre dışı bırakabilirsiniz.

  • KEEPDEFAULTS ipucu ekleme, tablo sütunun varsayılan değeri, varsa, veri kaydının sütun için bir değeri eksik zaman NULL yerine izin verir.

  • Alınan veri dosyası, hedef kimlik sütun için kimlik değerleri KEEPIDENTITY ipucu verir tablo.

Bu en iyi duruma getirmeleri için BULK INSERT komutunu birlikte Kullanılabilenler benzer.Daha fazla bilgi için bkz:Tablo ipuçları (Transact-SQL).

Veri Türleri

Satır eklediğinizde, aşağıdaki veri türü davranışını dikkate alın:

  • Bir değer içeren sütunlar halinde yükleniyor, bir char, varchar, veya varbinary veri türü, doldurma veya boşluk (boşluk izleyen, kesme char ve varchar, için sıfırlar. varbinary) tablo oluşturduğunuzda, sütun için tanımlanmış küme ANSI_PADDING ayarı tarafından belirlenir. Daha fazla bilgi için bkz:küme ANSI_PADDING (Transact-SQL).

    Aşağıdaki tablo için küme ANSI_PADDING OFF varsayılan işlemini gösterir.

    Veri türü

    Varsayılan işlem

    char

    Doldurma değeri boşluklarla tanımlanmış genişlik için sütun.

    varchar

    Son boşluk olmayan karakter ya da kaldırma izleyen dizer bir karakter için yalnızca boşluk oluşan dizeler single-space.

    varbinary

    Ardarda sıfırları kaldırın.

  • Boş bir dize ise (' ') içine yüklü olduğu bir sütun ile bir varchar veya text Veri, varsayılan işlem sıfır uzunluklu bir dize yüklenemedi türüdür.

  • null bir değer ekleme bir text veya image sütun geçerli metni gösteren bir işaretçi oluşturmak veya bir 8 KB metin sayfa preallocate yapar. Ekleme hakkında daha fazla bilgi için text ve image verileri için bkz: Metin, ntext ve görüntü işlevlerini kullanma.

  • Oluşturulan sütun uniqueidentifier veri türü deposu, 16 bayt ikili değerleri özel olarak biçimlendirilmiş. Farklı kimlik sütunlarla Database Engine değerleri içeren sütunlar için otomatik olarak oluşturmuyor uniqueidentifier veri türü. Ekleme işlemi sırasında değişkenleri bir veri türü uniqueidentifier dize sabitleri formunda ve xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx (tire içeren 36 karakter burada x aralık 0-9 veya a-f onaltılık bir sayı olan) kullanılabilir için uniqueidentifier sütunlar. Örneğin, 6F9619FF-8B86-D011-B42D-00C04FC964FF için geçerli bir değer olur. bir uniqueidentifier değişken veya sütun. Use newid() işlev bir genel benzersiz KIMLIK (GUID) elde etmek için.

Kullanıcı tanımlı tür sütunlar içinde değerler ekleme

Kullanıcı tanımlı tür sütunu değerleri ekleyebilirsiniz:

  • Kullanıcı tanımlı tür değeri sağlama.

  • Bir değer sağlayan bir SQL Server Kullanıcı tanımlı tür örtülü veya açık dönüştürme türü desteklediği sürece sistem veri türü. Aşağıdaki örnek, bir değer ekleme gösterir bir sütun kullanıcı tanımlı türü Point, açıkça bir dizeden dönüştürerek.

    INSERT INTO Cities (Location)
    VALUES ( CONVERT(Point, '12.3:46.2') );
    

    Tüm kullanıcı tanımlı türler ikili örtük olarak dönüştürülebilir olmadığından BIR ikili değer, açık Dönüştürme yapmadan da sağlanabilir.Dönüştürme ve kullanıcı tanımlı türler hakkında daha fazla bilgi için bkz: Kullanıcı tanımlı türler üzerinde işlem gerçekleştirme.

  • Kullanıcı tanımlı işlev, arama, kullanıcı tanımlı tür değerini döndürür.Aşağıdaki örnek, kullanıcı tanımlı bir işlev kullanır. CreateNewPoint() Yeni bir değer türü kullanıcı tanımlı oluşturmak için Point ve içine değer Cities Tablo.

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

Hata işleme

INSERT deyimi için bir TRY…CATCH yapısı içinde deyim belirleyerek hata uygulayabilirsiniz.Daha fazla bilgi için bkz:Kullanarak TRY... CATCH Transact-SQL'DE.

INSERT deyim için bir kısıtlama veya kuralı ihlal veya sütunun veri türü ile uyumsuz daha büyük bir değer varsa, deyim başarısız olur ve bir hata iletisi döndürdü.

INSERT SELECT veya yürütmek birden çok satır yükleniyor, herhangi bir kural veya yükleniyor değerlerden oluşan bir kısıtlama ihlali durdurulması deyim neden olur ve hiçbir satır yüklenir.

INSERT ifade (taşma, sıfır veya bir etki alanı hata bölme) aritmetik hatayla karşılaştığında ifade değerlendirme sırasında gerçekleşen Database Engine küme ARITHABORT ON olarak ayarlandığında, bu hatalar işler. toplu iş iş iş durdurulur ve bir hata iletisi döndürdü.küme ARITHABORT ve küme ANSI_WARNINGS KAPALı, INSERT, zaman ifade değerlendirme sırasında DELETE veya UPDATE ifade bir aritmetik hata, taşma, sıfıra bölme veya bir etki alanı hata karşılaşır SQL Server ekler veya bir NULL değeri güncelleştirir. Hedef sütun null değilse, ekleme veya güncelleştirme işlemi başarısız olur ve kullanıcı bir hata alır.Daha fazla bilgi için bkz:ARITHABORT ve ARITHIGNORE ON ayarladığınızda davranışı.

Birlikte çalışabilirlik

Bir INSTEAD OF tetikleyicisi INSERT eylemi tablo veya Görünüm karşı tanımlandığında, tetik yerine INSERT deyim yürütür.Daha fazla bilgi için ıNSTEAD OF tetikleri, bkz: (Transact-SQL) TRIGGER CREATE.

Kısıtlamaları ve sınırlamaları

Uzak tablolarına değerler ekler ve belirtilen tüm değerleri tüm sütunlar için belirtilen değerleri eklenecek olduğu bir sütun tanımlamalısınız.

küme ROWCOUNT seçeneği ayarı, yerel ve uzak bölümlendirilmiş görünümlerde karşı INSERT deyimleri için yoksayılır.Ayrıca, bu seçenek için uzak tablo karşı verilen INSERT deyimleri desteklenmez.

Important noteImportant Note:

küme ROWCOUNT kullanarak, DELETE, INSERT ve UPDATE deyimi bir sonraki sürümdeki etkilemez SQL Server. Değil küme ROWCOUNT yeni geliştirme çalışmayı, DELETE, INSERT ve UPDATE deyimleri kullanmak ve şu anda onu kullanan uygulamalar değiştirmek planlama.TOP yan tümce yerine kullanmanız önerilir.

Günlüğe kaydetme davranışı

INSERT deyim dışında OPENROWSET işlevini BULK anahtar sözcük veya INSERT INTO kullanırken kullanarak, her zaman tam olarak kaydediliyor <target_table> SEÇİN <sütunları> GELEN <source_table>. Bu işlem, en az günlüğe kaydedilebilir.Daha fazla bilgi için bu konuda daha önce "En iyi yöntemler için toplu yükleme verileri" bölümüne bakın.

Güvenlik

Gönderen sunucu, bir bağlantılı sunucu bağlantı sırasında bir oturum açma adı ve parola, alıcı sunucunun onun adına bağlanmayı sağlar.Çalışmak Bu bağlantı için bir oturum açma eşlemesi kullanarak bağlı sunucular arasında oluşturmalısınız. sp_addlinkedsrvlogin.Daha fazla bilgi için bkz:Bağlantılı sunucular için güvenlik.

Bunu anlamak önem taşır OPENROWSET(BULK…) kullandığınızda, nasıl SQL Server kimliğe bürünme işler. Daha fazla bilgi için "Güvenlik konuları" konusuna bakın. BULK INSERT veya OPENROWSET(BULK...) kullanarak toplu veri alınıyor.

İzinler

INSERT izin hedef gereklidir tablo.

Izinleri varsayılan üyelere INSERT sysadmin sabit sunucu rolü, db_owner ve db_datawriter sabit veritabanı rolü ve tablonun sahibi. Üyeleri sysadmin, db_ownerve db_securityadmin roller ve tablo sahibine izinler diğer kullanıcılara transfer edebilirsiniz.

INSERT BULK seçeneği OPENROWSET işlevini kullanarak çalıştırmak için , bir üyesi olmanız sysadmin sabit sunucu rolü veya bulkadmin sabit sunucu rolü.

Örnekler

Örnekler için bkz: Örnekler (Transact-SQL) INSERT.