Insert (Transact-sql)

Bir tablo veya görünümde bir veya daha çok satır ekler SQL Server 2012. Örnekler için bkz: örnekleri.

Konu bağlantısı simgesi Transact-SQL Sözdizim Kuralları

Sözdizimi

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

<column_definition> ::=
 column_name <data_type>
    [ COLLATE collation_name ]
    [ NULL | NOT NULL ]

<data type> ::= 
[ type_schema_name . ] type_name 
    [ ( precision [ , scale ] | max ]

-- External tool only syntax
INSERT 
{
    [BULK]
    [ database_name . [ schema_name ] . | schema_name . ]
    [ table_name | 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 ]
    ) ]
}
[; ]

Bağımsız değişkenler

  • İLE <common_table_expression>
    Geçici sonuç adlı kümesi, INSERT deyimi kapsamı içinde tanımlı olarak da bilinen ortak tablo ifade, belirtir. Sonuç kümesi, bir select deyimi türetilir. Daha fazla bilgi için, bkz. Common_table_expression (Transact-sql).

  • TOP (expression) [ PERCENT ]
    Sayı veya eklenecek rastgele satır yüzdesini belirtir. expressionbir sayı veya satırları yüzdesi olabilir. 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 iş.

  • server_name
    Tablo veya Görünüm bulunduğu sunucu adıdır. server_name olarak belirtilen bir bağlantılı sunucu ad veya kullanarak opendatasource işlevi.

    Ne zaman server_namebağlantılı bir sunucu belirtilen database_nameve schema_namegerekli. Ne zaman server_nameopendatasource ile belirtilen database_nameve schema_nametüm veri kaynakları için geçerli olmayabilir ve uzak nesne erişen ole db sağlayıcı yeteneklerini tabi olan.

  • database_name
    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
    Tablo veya Görünüm veri alacak olan addır.

    A masa kapsam içinde değişken bir INSERT deyimi tablo kaynağı olarak kullanılabilir.

    Görünüm tarafından başvurulan table_or_view_namegüncelleştirilebilir olması gerekir ve bir temel tablo görünümünün from yan tümcesinde başvuru. Örneğin, çoklu masa görünüm içine INSERT kullanmanız gerekir bir column_listbir temel tablodan yalnızca sütun başvuran. Güncelleştirilebilir görünümler hakkında daha fazla bilgi için bkz: CREATE VIEW (Transact-SQL).

  • rowset_function_limited
    Ya da openquery veya openrowset işlevi. Bu işlevler uzak nesne erişen ole db sağlayıcı yeteneklerini tabi olarak kullanılır.

  • İLE (<table_hint_limited> [... n ] )
    Hedef tablo için izin verilen bir veya daha fazla tablo ipuçları belirtir. WITH anahtar sözcük 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).

    Önemli notÖnemli

    INSERT deyimleri hedef tablolar üzerinde holdlock, SERIALIZABLE, READCOMMITTED, repeatableread veya updlock ipuçları belirtme yeteneği bir gelecek sürümünde kaldırılacak SQL Server. Bu ipuçları INSERT deyimleri performansı etkilemez. Onları yeni geliştirme çalışmalarında kullanmaktan kaçının ve şu anda bunları kullanan uygulamaları değiştirmek planlıyoruz.

    INSERT deyimi hedef bir tablo tablock ipucu belirtme tablockx ipucu belirtme aynı etkiye sahiptir. Özel kilit masaya alınır.

  • (column_list)
    Bir veya daha fazla sütun veri eklemek hangi listesidir. column_listparantez içinde ve virgülle ayrılmış olması gerekir.

    Bir sütun içinde değilse, column_list, Veritabanı Altyapısı; sütun tanımına göre değer sağlamak mümkün olmalıdır Aksi durumda, satır yüklenemiyor. Veritabanı Altyapısı, Sütun için otomatik olarak bir değer sunar sütun:

    • IDENTITY özelliği vardır. Sonraki artımlı kimlik değeri kullanılır.

    • Varsayılan vardır. Sütunun varsayılan değeri kullanılır.

    • Have a timestampveri türü. Geçerli zaman damgası değeri kullanılır.

    • NULL olabilecek olduğunu. Null değeri kullanılır.

    • Hesaplanmış bir sütun var. Hesaplanan değeri kullanılır.

    column_listaçık değerler kimlik sütunu eklenir ve set ıdentıty_ınsert seçeneği on tablo olmalıdır kullanılmalıdır.

  • output yan tümcesi
    Döner satır ekleme işlemi bir parçası olarak eklenir. Sonuç işleme uygulaması için döndürülen ya da takılan bir tablo veya tablo değişkeni için daha fazla alay.

    output yan tümcesi yerel bölümlendirilmiş görünümlerde, Dağıtılmış bölümlenmiş görünümler veya uzak tabloları başvuru dml deyimlerini ya da içeren INSERT deyimleri desteklenmez bir execute_statement. output INTO yan içeren INSERT deyimleri desteklenmez bir <dml_table_source> tümcesi.

  • VALUES
    Liste veya eklenecek veri değerlerinin listesi sunar. Orada-meli var olmak her sütun için bir veri değeri column_list, belirtilirse veya tablodaki. Değer listesinin ayraç içine alınmalıdır.

    Değer listesindeki değerleri içinde değilseniz, aynı sipariş olarak tablodaki sütunların veya tablodaki her sütun için bir değer yoksa column_listgelen her değer depolar sütun açıkça belirtmek için kullanılmalıdır.

    Sen-ebilmek kullanma Transact-SQLtek bir INSERT deyimi içinde birden çok satır belirtmek için satır Oluşturucu (tablo değeri Oluşturucu olarak da adlandırılır). Satır Oluşturucu parantez içinde ve virgülle ayrılmış birden çok değer listesi tek bir values yan tümcesi içerir. Daha fazla bilgi için, bkz. Tablo Değeri Oluşturucusu (Transact-SQL).

  • DEFAULT
    Kuvvetler Veritabanı Altyapısıbir sütun için tanımlanan varsayılan değer yüklemek için. Sütunun varsayılan bir değeri yoksa ve sütun null değerlere izin veriyorsa, NULL girilir. İle tanımlanmış bir sütun için timestampveri türü, bir sonraki zaman damgası değeri eklenen. DEFAULT değeri kimlik sütunu için geçerli değildir.

  • expression
    Sabit bir değer, bir değişken veya bir ifadedir. İfade bir EXECUTE deyimi içeremez.

    Unicode karakter veri türleri başvururken nchar, nvarchar, ve ntext, 'expression' büyük harfle öneki 'n'. Eğer 'n' belirtilmemiş, SQL Serverkod sayfası için varsayılan harmanlama veritabanı veya sütun karşılık gelen dize dönüştürür. Bu kod sayfasında bulunmayan herhangi bir karakter kaybolur.

  • derived_table
    Tabloya yüklenecek veri satırları döndüren geçerli herhangi bir select deyimi iş. Ortak bir tablo ifade (cte) select deyimi içeremez.

  • execute_statement
    select veya readtext deyimi ile veri döndürür herhangi bir geçerli execute deyimi iş. Daha fazla bilgi için, bkz. execute (Transact-sql).

    execute deyimi sonuç kümeleri seçenekleri bir INSERT… belirtilemezexec deyimi.

    Eğer execute_statement kullanılan INSERT ile her sonuç kümesi sütunları içeren tabloyu veya buna uyumlu olmalıdır column_list.

    execute_statementaynı sunucu veya uzak bir sunucuda saklı yordamları yürütmek için kullanılabilir. Uzak sunucu yordamda yürütülen ve sonuç kümeleri yerel sunucuya geri döndü ve yerel sunucu tablosuna yüklenen. Bir dağıtılmış işlem, execute_statementbağlantı etkin birden çok etkin sonuç kümeleri (mars) sahip olduğunda bir Geridöngü bağlantılı sunucu karşı verilemez.

    Eğer execute_statementverileri döndürür readtext deyimi ile en fazla 1 mb (1024 kb) veri her readtext deyimi döndürebilir. execute_statementGenişletilmiş yordamlar ile de kullanılabilir. execute_statementGenişletilmiş yordamı ana iş parçacığı tarafından döndürülen veri ekler; Ancak, ana iş parçacığı dışındaki konuları çıktıları değil eklenir.

    exec INSERT deyimi hedef olarak tablo değerli bir parametre belirleyemezsiniz; Ancak, INSERT exec dize veya saklı yordam kaynağı olarak belirtilebilir. Daha fazla bilgi için, bkz. Tablo Valued Parametreler (veritabanı altyapısı) kullanma.

  • <dml_table_source>
    Hedef tabloya eklenen satır Bu isteğe bağlı where yan tümcesi tarafından filtrelenmiş bir INSERT, update, delete veya birleştirme deyimini output yan tümcesi döndürülen belirtir. Eğer <dml_table_source> belirtilirse, dış INSERT deyimi hedef aşağıdaki kısıtlamalar karşılaması gerekir:

    • Temel tablo, bir görünümü olmalıdır.

    • Bir uzak tablo olamaz.

    • Tanımlanmış tüm tetikleyiciler olamaz.

    • Herhangi bir birincil anahtarı yabancı anahtar ilişkileri alamaz.

    • Birleştirme çoğaltma veya işlem çoğaltma için güncelleştirilebilir abonelikleri alamaz.

    Veritabanı uyumluluk düzeyi 100 veya daha yüksek olarak ayarlanmalıdır. Daha fazla bilgi için, bkz. output Yantümcesi (Transact-sql).

  • <select_list>
    Virgülle ayrılmış bir liste sütunları eklemek output yan tümcesi tarafından döndürülen belirtme. Sütunları <select_list> içine değerlerinin eklendiği sütunlarla uyumlu olması gerekir. <select_list> toplama işlevleri veya textptr başvuru yapamazsınız.

    [!NOT]

    SEÇME listesinde listelenen tüm değişkenleri ne olursa olsun içinde kendilerine yapılan değişiklikler özgün değerlerine bakın <dml_statement_with_output_clause>.

  • <dml_statement_with_output_clause>
    Döner output yan tümcesi satırları etkilenen geçerli bir INSERT, update, delete veya birleştirme deyimi iş. Deyimi WITH yan tümcesini içeremez ve uzak tabloları veya bölümlenmiş görünümler hedef olamaz. update veya delete belirtilirse, it can't be imleç tabanlı bir güncelleştirme veya silme. Kaynak satırları iç içe dml deyimlerini başvurulamaz.

  • Burada <search_condition>
    Olan herhangi bir yerde yan tümcesi içeren geçerli bir <search_condition> tarafından döndürülen satır filtreleri <dml_statement_with_output_clause>. Daha fazla bilgi için, bkz. Arama koşulu (Transact-sql). Bu bağlamda kullanıldığında <search_condition> alt sorgular, veri erişimi, toplama işlevleri, textptr ya da tam metin arama yüklemler, skalar kullanıcı tanımlı işlevler içeremez.

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

  • BULK
    Harici araçlarla bir ikili veri akışı yüklemek için kullanılır. Bu seçenek araçları gibi yöneliktir değil SQL Server Management Studio, uygulama programlama arabirimleri gibi sqlcmd, osql ya da veri erişim SQL ServerNative Client.

  • FIRE_TRIGGERS
    Hedef Tablo tanımlanan herhangi bir ekleme Tetikleyicileri ikili veri akışı yükleme işlemi sırasında çalıştırmak belirtir. Daha fazla bilgi için, bkz. BULK INSERT (Transact-SQL).

  • CHECK_CONSTRAINTS
    Hedef Tablo veya görünüm tüm kısıtlamaları ikili veri akışı yükleme işlemi sırasında denetlenmeli belirtir. Daha fazla bilgi için, bkz. BULK INSERT (Transact-SQL).

  • KEEPNULLS
    Boş sütunlar null değeri ikili veri akışı yükleme işlemi sırasında korumak belirtir. Daha fazla bilgi için, bkz. (SQL Server) toplu alma işlemi sırasında NULL veya UseDefault değerleri tutmak.

  • KILOBYTES_PER_BATCH KILOBYTES_PER_BATCH =
    Kilobayt (kb) veri toplu başına yaklaşık sayısını belirtir kilobytes_per_batch. Daha fazla bilgi için, bkz. BULK INSERT (Transact-SQL).

  • rows_per_batch =rows_per_batch
    İkili veri akışı veri satırları yaklaşık sayısını gösterir. Daha fazla bilgi için, bkz. BULK INSERT (Transact-SQL).

    Not sütun liste verilmezse bir sözdizimi hatası oluşturulur.

En İyi Yöntemler

@@ rowcount istemci uygulamasına eklenen satır sayısı dönmek işlevi. Daha fazla bilgi için, bkz. @@ rowcount (Transact-sql).

Toplu veri alma için en iyi yöntemler

INSERT içine kullanmaToplu alma verileri ile en az bir günlük seçin

Sen-ebilmek kullanma-e INSERT INTO <target_table> seçin <sütun> from <source_table> verimli çok sayıda satır hazırlama bir tablo gibi bir tablodan başka bir tablo ile en az bir günlük transfer etmek. En az bir günlük deyimini performansını ve hareket sırasında kullanılabilir hareket günlük alanı doldurma işlemi olasılığını azaltır.

Bu deyim için minimal günlüğü aşağıdaki gereksinimleri vardır:

  • Veritabanı kurtarma modelini veya toplu oturum ayarlıdır.

  • Boş ya da boş bir yığın hedef tablodur.

  • Hedef Tablo çoğaltmasında kullanılır.

  • Hedef Tablo tablock İpucu belirtildi.

Bir yığın BIRLEŞTIRME deyimini INSERT eylem sonucu olarak eklenen satırlar da minimal kaydedilebilir.

Daha az kısıtlayıcı bir toplu güncelleştirme kilit içine yerleştirin tutan bulk INSERT deyimi,Bir özel (x) kilit tablo tablock İpucu tutar ile seçin. Buna paralel ekleme işlemlerini kullanarak satır ekleyemezsiniz.

openrowset ve toplu veri alma toplu olarak kullanma

openrowset işlevini bulk load optimizasyonlar INSERT deyimi ile sağlamak, aşağıdaki tablo ipuçları kabul edebilirsiniz:

  • tablock İpucu günlüğü kayıtlarını ekleme işlemini en aza indirebilirsiniz. Veritabanı kurtarma modelini basit veya toplu olarak ayarlanmalıdır ve hedef tablo çoğaltma kullanılamaz. Daha fazla bilgi için, bkz. Toplu alma Minimal günlüğü için Önkoşullar.

  • FOREIGN key ve check kısıtlaması denetimi IGNORE_CONSTRAINTS İpucu geçici olarak devre dışı bırakabilirsiniz.

  • IGNORE_TRIGGERS İpucu tetikleyici yürütme geçici olarak devre dışı bırakabilirsiniz.

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

  • Hedef tablonun kimlik sütunu için kullanılmak üzere alınan veri dosyasında kimlik değerleri KEEPIDENTITY ipucu verir.

Bu iyileştirmeler bulk INSERT komutu ile mevcut 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:

  • Eğer bir değer içeren sütunlar içine yükleniyor bir char, varchar, ya varbinaryveri türü, doldurma veya sondaki boşluk, kesme (için alanlarda charve varchar, sıfır için varbinary) 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 varsayılan işlem için set ANSI_PADDING off gösterir.

    Veri türü

    Varsayılan işlem

    char

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

    varchar

    Kaldırma sondaki alanlarda son boşluk olmayan karakter ya da bir karakter için yalnızca boşluk oluşan dizeler tek satır aralığı bırakma.

    varbinary

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

  • Eğer boş bir dize (' ') ile bir sütununa yüklendi bir varcharya textveri türü, varsayılan işlem olan sıfır uzunluklu bir dize yüklenemiyor.

  • Boş bir değer ekleme bir textya imagesütun geçerli metin imleci oluşturmak değil, ne de o 8 kb metin sayfasına erişinceye yok.

  • İle oluşturulan sütunlar uniqueidentifierveri türü deposu özel olarak biçimlendirilmiş 16 bayt ikili değerler. Aksine kimlik sütun, Veritabanı Altyapısıdeğerler içeren sütunlar için otomatik olarak oluşturmaz uniqueidentifierveri türü. Değişkenleri veri ekleme işlemi sırasında yazın uniqueidentifierve dize sabitleri şeklinde xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx(tire dahil 36 karakter nerede xaralığı 0-9 veya a-f onaltılı basamak olan) kullanılabilir uniqueidentifiersütunları. Örneğin, 6F9619FF-8B86-D011-B42D-00C04FC964FF için geçerli bir değer olup bir uniqueidentifier değişken veya sütun. Kullanım newid işlevi bir genel benzersiz kimliğini (GUID) elde edilir.

Kullanıcı tanımlı tür sütunlar değerleri ekleme

Tarafından kullanıcı tanımlı türü sütunlardaki değerleri ekleyebilirsiniz:

  • Kullanıcı tanımlı türünde bir değer sağlama.

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

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

    Çünkü tüm kullanıcı tanımlı türler örtük olarak dönüştürülebilir ikili ikili değer açık dönüştürme yapmadan da sağlanabilir.

  • Kullanıcı tanımlı bir işlev, kullanıcı tanımlı türünde bir değer döndürür. Aşağıdaki örnek, kullanıcı tanımlı bir işlev kullanır CreateNewPoint()kullanıcı tanımlı türü için yeni bir değer oluşturmak için Pointve içine ekler Citiestablosu.

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

Hata işleme

INSERT deyimi içinde a denemek… deyimi belirterek Alınışları uygulayabilirsinizcatch yapı.

INSERT deyimi kısıtlaması veya kuralı ihlal eden veya sütunun veri türü ile uyumlu olmayan bir değer varsa, 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üklenirken bir kural veya yüklenmesini değerlerden oluşan kısıtlama ihlali durdurulması deyimi neden ve hiçbir satır yüklenir.

INSERT deyimi (taşma, sıfır ya da bir etki alanı hata bölme) aritmetik hata karşılaştığında ifade değerlendirme sırasında meydana gelen Veritabanı Altyapısısanki set ARITHABORT on olarak ayarlanmışsa, bu hatalar işler. Toplu işlem durduruldu, bir hata iletisi döndürülür. set ARITHABORT set ANSI_WARNINGS kapalı, INSERT, zaman ve ifade değerlendirme sırasında aritmetik hata, taşma, sıfır ile bölme veya bir etki alanı hata, delete veya update deyimi karşılaştığında SQL Serverekler veya null değeri güncelleştirir. Hedef sütunu null değilse, Ekle veya Güncelleştir eylemi başarısız olur ve kullanıcı bir hata alır.

Birlikte Çalışabilirlik

INSTEAD of Tetikleyici INSERT eylemlere karşı bir tablo ya da görünüm tanımlandığında, tetikleyici Instead of INSERT deyimi yürütür. Hakkında daha fazla bilgi için ıNSTEAD OF Tetikleyicileri, bakın CREATE TRIGGER (Transact-SQL).

Sınırlamalar ve Kısıtlamalar

Uzak tablo değerleri eklemek ve tüm sütunlar için tüm değerleri belirtilen belirtilen değerleri eklenecek olan sütunlar tanımlamanız gerekir.

top kullanıldığında INSERT ile bulunulan satır herhangi bir sırayla düzenlenir değildir ve order by yan tümcesi bu ifadeleri doğrudan belirtilen değil. Anlamlı bir tarih sırasına göre satır eklemek için üst kullanmanız gerekiyorsa, top subselect deyimi içinde belirtilen bir order by yan tümcesi ile birlikte kullanmanız gerekir. Bu konuda aşağıdaki örnekler bölümüne bakın.

Kilitleme davranışı

INSERT deyimi her zaman bir özel (x) kilidi değiştirir ve hareket tamamlanıncaya kadar bu kilit tutan tablo satın aldı. Özel bir kilit ile diğer hareketleri verileri değiştirebilirsiniz; işlemleri yalnızca nolock ipucunu kullanımı ile gerçekleşecek veya UNCOMMITTED yalıtım düzeyi okuma okuyun. Başka bir kilitleme yöntemini belirterek INSERT deyimi süresi için bu varsayılan davranışı geçersiz kılmak için Tablo ipuçları belirtebilirsiniz, ancak ipuçları yalnızca son çare olarak deneyimli geliştiriciler ve veritabanı yöneticileri tarafından kullanılması önerilir. Daha fazla bilgi için, bkz. Tablo ipuçları (Transact-sql).

Günlüğe Yazma Davranışı

INSERT deyimi her zaman tamamen dışında toplu anahtar sözcüğüyle openrowset işlevini kullanarak veya INSERT INTO kullanarak oturum <target_table> seçin <sütun> from <source_table>. Bu işlemler en az kaydedilebilir. Daha fazla bilgi için bkz: "En iyi yöntemler için toplu yükleme verileri" bölümünde Bu konunun önceki kısımlarında.

Güvenlik

Bir bağlantılı sunucu bağlantısı sırasında bir oturum açma adı ve kendi adına alıcı sunucuya bağlanmak için parola gönderen sunucu sağlar. Bu bağlantının çalışması için bir oturum açma eşleme kullanarak bağlantılı sunucular arasında oluşturmalısınız sp_addlinkedsrvlogin.

openrowset(bulk…) kullandığınızda, bunu anlamak önemlidir nasıl SQL Serverkimliğe bürünme işler. Daha fazla bilgi için bkz: "Güvenlik konuları" in Toplu veri bulk INSERT veya openrowset(bulk...) kullanarak alma (SQL Server).

İzinler

Hedef Tablo INSERT izni gerekir.

Üyeleri için varsayılan izinleri Ekle sysadminsabit sunucu rolü, db_ownerve db_datawritersabit veritabanı rolleri ve tablo sahibi. Üyeleri sysadmin, db_ownerve db_securityadminrol sahibi transfer ve izinleri diğer kullanıcılara.

openrowset işlevini bulk seçeneği ile INSERT yürütmek için bir üyesi olmalıdır sysadminsabit sunucu rolü veya bulkadminsunucu rolü.

Örnekler

Kategori

Seçme sözdizimi öğeleri

Temel sözdizimi

• Tablo değeri Oluşturucu ekleme

Sütun değerleri işleme

• Kullanıcı tanımlı türler kimlik • NEWID • varsayılan değerler

Diğer tablolardan veri ekleme

INSERT…SEÇME • INSERT…YÜRÜTME ile ortak tablo ifade • top • ofset getir

Hedef nesne standart tablolar dışındaki belirtme

Gösterim • Tablo değişkenleri

Uzak tabloya satır ekleme

Bağlantılı sunucu • openquery satır kümesi işlevi • opendatasource satır kümesi işlevi

Toplu yükleme verileri tabloları veya veri dosyaları

INSERT…Seçme • openrowset işlevini

Ipuçlarını kullanarak sorgu en iyi duruma getiricisi varsayılan davranışını geçersiz kılma

Tablo ipuçları

INSERT deyimi sonuçları yakalama

output yan tümcesi

Temel sözdizimi

Bu bölümdeki örnekler, en az gerekli sözdizimini kullanarak INSERT deyimi temel işlevselliğini göstermektedir.

A.Tek bir veri satırı ekleme

Aşağıdaki örnek bir satır ekler Production.UnitMeasuretablosu. Bu tablodaki sütunlar UnitMeasureCode, Name, ve ModifiedDate. Çünkü tüm sütunlar için değerleri sağlanan ve tablo sütunları aynı sırada listelenen sütun adları sütun listesinde belirtilmesi gerekmez.

USE AdventureWorks2012;
GO
INSERT INTO Production.UnitMeasure
VALUES (N'FT', N'Feet', '20080414');
GO

B.Birden çok satır veri ekleme

Aşağıdaki örnek Tablo değeri Oluşturucu içine üç satır eklemek için Production.UnitMeasuretek bir INSERT deyimi tablo. Tüm sütunların değerleri sağlandığından ve değerler tablodaki sütunlarla aynı sırada listelendiklerinden, sütun adlarının sütun listesinde belirtilmesi gerekmez.

USE AdventureWorks2012;
GO
INSERT INTO Production.UnitMeasure
VALUES (N'FT2', N'Square Feet ', '20080923'), (N'Y', N'Yards', '20080923'), (N'Y3', N'Cubic Yards', '20080923');
GO

C.Tablo sütunları aynı sırada olmayan veri ekleme

Aşağıdaki örnek, her sütuna eklenen değer açıkça belirtmek için sütun listesi kullanır. Sütun sırasını Production.UnitMeasuremasa UnitMeasureCode, Name, ModifiedDate; Ancak, sütunlar bu sırada listelenen değil column_list.

USE AdventureWorks2012;
GO
INSERT INTO Production.UnitMeasure (Name, UnitMeasureCode,
    ModifiedDate)
VALUES (N'Square Yards', N'Y2', GETDATE());
GO

Sütun değerleri işleme

Bu bölümdeki örnekler IDENTITY özelliği ile varsayılan değer, tanımlanmış olan ya da veri türleriyle tanımlanmış olduğu gibi sütunlar değerleri ekleme yöntemleri göstermektedir uniqueidentiferveya kullanıcı tanımlı türü sütunlarındaki.

A.Varsayılan değerleri olan sütunlar ile bir tabloya veri ekleme

Aşağıdaki örnek, sütunları otomatik olarak bir değer oluşturmak veya bir varsayılan değere sahip olan bir tabloya satır eklemek gösterir. Column_1otomatik olarak eklenen değer bir dize içinde birleştirerek bir değer üreten bir hesaplanan sütun column_2. Column_2varsayılan kısıtlama ile tanımlanır. Bu sütun için bir değer belirtilmezse, varsayılan değer kullanılır. Column_3ile tanımlanan rowversionotomatik olarak oluşturulan benzersiz, artan ikili bir sayı veri türü,. Column_4otomatik olarak bir değer üretmez. Bu sütun için bir değer belirtildiğinde null eklenecektir. INSERT deyimleri için bazı sütunlar ama tüm değerleri içeren satırları ekleyin. Son INSERT deyiminde hiçbir sütun belirtilen ve yalnızca varsayılan değerleri default values yan tümcesi kullanılarak eklenir.

USE AdventureWorks2012;
GO
IF OBJECT_ID ('dbo.T1', 'U') IS NOT NULL
    DROP TABLE dbo.T1;
GO
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

B.Kimlik sütunu olan bir tabloya veri ekleme

Aşağıdaki örnek, kimlik sütunu veri ekleme farklı yöntemleri gösterir. İlk iki INSERT deyimleri, yeni satırlar için oluşturulacak kimlik değerleri sağlar. Üçüncü INSERT deyimi set ıdentıty_ınsert deyimi sütun KIMLIK özelliği geçersiz kılar ve kimlik sütunu açıkça bir değer ekler.

USE AdventureWorks2012;
GO
IF OBJECT_ID ('dbo.T1', 'U') IS NOT NULL
    DROP TABLE dbo.T1;
GO
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

C.Newid kullanarak benzersiztanıtıcı sütuna veri ekleme

Aşağıdaki örnek NEWIDiçin bir GUID elde etmek için () fonksiyonu column_2. Aksine kimlik sütunları Veritabanı Altyapısıdeğerler içeren sütunlar için otomatik olarak oluşturmaz benzersiztanıtıcı ikinci tarafından gösterildiği gibi veri türü, INSERTdeyimi.

USE AdventureWorks2012;
GO
IF OBJECT_ID ('dbo.T1', 'U') IS NOT NULL
    DROP TABLE dbo.T1;
GO
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;
GO

D.Veri türü kullanıcı tanımlı sütunlar ekleme

Aşağıdaki Transact-SQLüç satır içine INSERT deyimleri PointValuesütununda Pointstablosu. Bu sütunu kullanan bir clr türü kullanıcı tanımlı (udt). PointVeri türü oluşur x ve y tamsayı değerlerini udt özellikler olarak maruz kalan. Virgülle ayrılmış cast cast veya convert işlevini kullanmalısınız x ve y değerleri için Pointtürü. İlk iki ifade, bir dize değeri dönüştürmek için çevir fonksiyonunu kullanın. Point türü ve üçüncü ifade kullanan cast işlevi. Daha fazla bilgi için, bkz. udt veri işleme.

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));

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 örnekler satır bir tablodan başka bir tabloya ekleme yöntemleri göstermektedir.

A.Diğer tablolardan veri eklemek için seçin ve Çalıştır seçeneklerini kullanma

Aşağıdaki örnek veri INSERT… kullanarak bir tablodan başka bir tabloya ekleme gösterilmiştirSEÇİN veya INSERT…YÜRÜTME. Her sütun listesinden bir ifade ve bir hazır bilgi değeri içeren çok tablolu bir select deyimi dayanır.

Kaynak tablodan verileri türetmek için bir select deyimi ilk INSERT deyimi kullanır (Employee, SalesPerson, ve Person) ve sonuç kümesinin EmployeeSales tablosu. İkinci INSERT deyimi yürütme yan tümcesi select deyimi içeren bir saklı yordam çağrısı kullanır ve üçüncü INSERT select deyimi bir hazır bilgi dizesi olarak başvurmak için execute yan tümcesi kullanır.

USE AdventureWorks2012;
GO
IF OBJECT_ID ('dbo.EmployeeSales', 'U') IS NOT NULL
    DROP TABLE dbo.EmployeeSales;
GO
IF OBJECT_ID ('dbo.uspGetEmployeeSales', 'P') IS NOT NULL
    DROP PROCEDURE uspGetEmployeeSales;
GO
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;
GO

B.Eklenen verileri tanımlamak ile ortak tablo ifade kullanma

Aşağıdaki örnek oluşturur NewEmployeetablosu. Ortak bir tablo ifade (EmployeeTemp) eklenecek bir veya daha fazla tablodan satırları tanımlayan NewEmployeetablosu. Ortak tablo ifade sütunları INSERT deyimi başvurur.

USE AdventureWorks2012;
GO
IF OBJECT_ID (N'HumanResources.NewEmployee', N'U') IS NOT NULL
    DROP TABLE HumanResources.NewEmployee;
GO
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

C.Kaynak tablosundan eklenen verileri sınırlamak için top kullanma

Aşağıdaki örnek tablo oluşturur EmployeeSalesve adını ve tablonun üst 5 rastgele çalışanlar için yıllık tarihi satış verilerini ekler HumanResources.Employee. INSERT deyimi tarafından döndürülen 5 satırları seçer SELECTdeyimi. output yan tümcesi eklenir satırları görüntüler EmployeeSalestablosu. order by yan tümcesi select deyimi içinde en iyi 5 çalışanı belirlemek için kullanılmadığını unutmayın.

USE AdventureWorks2012 ;
GO
IF OBJECT_ID ('dbo.EmployeeSales', 'U') IS NOT NULL
    DROP TABLE dbo.EmployeeSales;
GO
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 tarih sırasına göre satır eklemek için üst kullanmanız gerekiyorsa, aşağıdaki örnekte gösterildiği gibi top ile birlikte order by subselect deyimi içinde kullanmalısınız. output yan tümcesi eklenir satırları görüntüler EmployeeSalestablosu. En iyi 5 çalışanlar artık rastgele satır yerine order by yan tümcesi sonuçlarına göre eklenen 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;

Hedef nesne standart tablolar dışındaki belirtme

Bu bölümdeki örnekler, bir görünüm veya tablo değişkeni belirterek satır eklemek nasıl gösterilmektedir.

A.Görünüm belirterek veri ekleme

Aşağıdaki örnek, hedef nesnenin görünüm adını belirtir; Ancak, yeni bir satır alttaki tablo eklenir. Değerlerin sırasını INSERTdeyimi eşleşmesi görünümü sütun sırası. Daha fazla bilgi için, bkz. Bir görünüm üzerinden veri değiştirme.

USE AdventureWorks2012;
GO
IF OBJECT_ID ('dbo.T1', 'U') IS NOT NULL
    DROP TABLE dbo.T1;
GO
IF OBJECT_ID ('dbo.V1', 'V') IS NOT NULL
    DROP VIEW dbo.V1;
GO
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

B.Tablo değişkeni veri ekleme

Aşağıdaki örnek, hedef nesne olarak bir tablo değişkeni belirtir.

USE AdventureWorks2012;
GO
-- 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 örnekler kullanarak bir uzak hedef tabloya satır eklemek nasıl gösterilmektedir bir bağlantılı sunucu ya da bir satır kümesi işlevi uzak tablo başvurmak.

A.Bağlantılı bir sunucu kullanarak uzak bir tabloya veri ekleme

Aşağıdaki örnek, uzak bir tabloya satır ekler. Uzak veri kaynağına bir bağlantı kullanarak oluşturarak örnek başlıyor sp_addlinkedserver. Bağlantılı sunucu adı, MyLinkServer, sonra dört nesne adı şeklinde bir parçası olarak belirtilen server.catalog.schema.object.

USE master;
GO
-- Create a link to the remote data source. 
-- Specify a valid server name for @datasrc as 'server_name' or 'server_name\instance_name'.

EXEC sp_addlinkedserver @server = N'MyLinkServer',
    @srvproduct = N' ',
    @provider = N'SQLNCLI', 
    @datasrc = N'server_name',
    @catalog = N'AdventureWorks2012';
GO

USE AdventureWorks2012;
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.AdventureWorks2012.HumanResources.Department (Name, GroupName)
VALUES (N'Public Relations', N'Executive General and Administration');
GO

B.openquery işlevini kullanarak uzak bir tabloya veri ekleme

Aşağıdaki örnek, belirterek uzak bir tabloya bir satır ekler openquery satır kümesi işlevi. Örneğin önceki örnekte oluşturulmuş bağlantılı sunucu adı kullanılır.

-- Use the OPENQUERY function to access the remote data source.

INSERT OPENQUERY (MyLinkServer, 'SELECT Name, GroupName FROM AdventureWorks2012.HumanResources.Department')
VALUES ('Environmental Impact', 'Engineering');
GO

C.opendatasource işlevi kullanarak uzak bir tabloya veri ekleme

Aşağıdaki örnek, belirterek uzak bir tabloya bir satır ekler opendatasource satır kümesi işlevi. Biçimi kullanarak geçerli bir sunucu adı veri kaynağı belirtmek server_nameya server_name\instance_name.

-- 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_name\instance_name.

INSERT INTO OPENDATASOURCE('SQLNCLI',
    'Data Source= <server_name>; Integrated Security=SSPI')
    .AdventureWorks2012.HumanResources.Department (Name, GroupName)
    VALUES (N'Standards and Methods', 'Quality Assurance');
GO

Toplu veri tabloları veya veri dosyaları yükleme

Bu bölümdeki örnekler INSERT deyimi kullanarak bir tabloya yükü veri toplu olarak iki yöntem gösterilmektedir.

A.Minimal günlüğü ile yığın ekleme veri

Aşağıdaki örnek bir yeni tablo (yığın) ve içine en az bir günlük kullanarak başka bir tablodan veri ekler. Örnek varsayar kurtarma modeli AdventureWorks2012veritabanı tam olarak ayarlanmışsa. Kullanılan en az bir günlük olduğundan emin olmak için kurtarma modeli AdventureWorks2012veritabanı, bulk_logged için ayarlanmışsa, önce satır eklenir ve sonra Ekle içine tam olarak sıfırlaselect deyimi. Ayrıca, hedef tablo tablock ipucu belirtilen Sales.SalesHistory. Bu deyimi hareket günlüğündeki en az alanı kullanır ve verimli yapar sağlar.

USE AdventureWorks2012;
GO
-- 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 AdventureWorks2012
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 AdventureWorks2012
SET RECOVERY FULL;
GO

B.openrowset işlevini bulk ile toplu yükleme verileri için tablo kullanma

Aşağıdaki örnek veri dosyasından bir tabloya openrowset işlevini belirterek satır ekler. IGNORE_TRIGGERS tablo ipucu performans optimizasyonu için belirtilir. Daha fazla örnek için bkz: Toplu veri bulk INSERT veya openrowset(bulk...) kullanarak alma (SQL Server).

-- Use the OPENROWSET function to specify the data source and specifies the IGNORE_TRIGGERS table hint.
INSERT INTO HumanResources.Department WITH (IGNORE_TRIGGERS) (Name, GroupName)
SELECT b.Name, b.GroupName 
FROM OPENROWSET (
    BULK 'C:\SQLFiles\DepartmentData.txt',
    FORMATFILE = 'C:\SQLFiles\BulkloadFormatFile.xml',
    ROWS_PER_BATCH = 15000)AS b ;
GO

Ipuçlarını kullanarak sorgu en iyi duruma getiricisi varsayılan davranışını geçersiz kılma

Bu bölümdeki örnekler göstermek nasıl kullanılacağını Tablo ipuçları INSERT deyimi işlenirken sorgu en iyi duruma getiricisi varsayılan davranış geçici olarak geçersiz kılmak için.

Dikkat notuDikkat

Çünkü SQL Serversorgu en iyi duruma getiricisi genellikle en iyi bir sorgu yürütme planını seçer, biz ipuçları yalnızca son çare olarak deneyimli geliştiriciler ve veritabanı yöneticileri tarafından kullanılması önerilir.

A.Bir kilitleme yöntemini belirtmek için tablock ipucu kullanma

Aşağıdaki örnek, bir özel (x) kilit Production.Location masaya alınır ve INSERT deyimi sonuna kadar tutuluyor belirtir.

USE AdventureWorks2012;
GO
INSERT INTO Production.Location WITH (XLOCK)
(Name, CostRate, Availability)
VALUES ( N'Final Inventory', 15.00, 80.00);
GO

INSERT deyimi sonuçları yakalama

Bu bölümdeki örnekler göstermek nasıl kullanılacağını output yan tümcesi bilgilerden ya da temel ifadeleri geri dönmek için her satırın etkilenen bir INSERT deyimi tarafından. Bu sonuçlar, işleme uygulamasına onay iletileri, arşivleme ve diğer uygulama şartlar gibi şeyler kullanmak için döndürülebilir.

Bir INSERT deyimi kullanarak çıktı

Aşağıdaki örnek bir satır ekler ScrapReasontablo ve uses OUTPUTdeyimi sonuçları döndürmek için yan @MyTableVartablo değişkeni. Çünkü ScrapReasonIDsütun ile tanımlanmış bir IDENTITYözelliğinin değeri belirtilen içinde INSERTo sütunun deyimini. Ancak tarafından oluşturulan değeri not Veritabanı Altyapısıiçin bu sütunu iade OUTPUTyan INSERTED.ScrapReasonIDsütun.

USE AdventureWorks2012;
GO
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;
GO

B.Çıkış kullanarak kimlik ve hesaplanan sütunları

Aşağıdaki örnek oluşturur EmployeeSalestablo ve ardından birkaç satır kaynak tablodan veri almak için bir select deyimi ile bir INSERT deyimi kullanarak ekler. EmployeeSalesTablonun kimlik sütunu içeren (EmployeeID) ve hesaplanmış bir sütun (ProjectedSales). Çünkü bu değerler tarafından oluşturulan Veritabanı Altyapısıekleme işlemi sırasında bu sütunlar hiçbiri tanımlanabilir @MyTableVar.

USE AdventureWorks2012 ;
GO
IF OBJECT_ID ('dbo.EmployeeSales', 'U') IS NOT NULL
    DROP TABLE dbo.EmployeeSales;
GO
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;
GO

C.Yan döndürülen veri ekleme

Aşağıdaki örnek, BIRLEŞTIRME deyimini output yan tümcesi döndürülen verileri yakalar ve bu verileri başka bir tabloya ekler. BİRLEŞTİRME deyimini güncelleştirmeleri Quantitysütununda ProductInventoryişlenir siparişleri temel alınarak günlük, Masa SalesOrderDetailtablosu. Ayrıca, satırları 0 olan stokların düşmesi ürünleri siler. Örneğin silinir ve bunları başka bir tabloya ekler satır yakalar ZeroInventory, hangi ürünleri ile stok izler.

USE AdventureWorks2012;
GO
IF OBJECT_ID(N'Production.ZeroInventory', N'U') IS NOT NULL
    DROP TABLE Production.ZeroInventory;
GO
--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; 

Ayrıca bkz.

Başvuru

BULK INSERT (Transact-SQL)

Sil (Transact-sql)

execute (Transact-sql)

FROM (Transact-sql)

IDENTITY (Özellik) (Transact-SQL)

NEWID (Transact-SQL)

select (Transact-sql)

Güncelleştirme (Transact-sql)

BİRLEŞTİRME (Transact-sql)

output Yantümcesi (Transact-sql)

Kavramlar

Eklenen ve silinen tabloları kullanın