Share via


OUTPUT yan tümce (Transact-SQL)

Bilgileri veya temel ifadeler, INSERT, UPDATE, DELETE veya birleştirme bir deyim tarafından etkilenen her bir satır döndürür.Bu sonuçlar, işleme uygulama onay iletilerini arşivleme ve başka tür bir uygulama gereksinimleri gibi şeyler kullanmak için döndürülebilir.Sonuçlar bir tablo veya tablo değişkeni içine eklenebilir.Ayrıca, bir OUTPUT sonuçlarını yakalayabilir yan tümce iç içe geçmiş bir INSERT, UPDATE, DELETE, ya da deyim BİRLEŞTİRMEK ve bu sonuçlar hedef tablo veya Görünüm yerleştirin.

Not

Bir OUTPUT olan bir UPDATE, INSERT veya DELETE deyim yan tümce deyim hatayla karşılaştığında ve geri bile satır istemciye döndürür.deyim çalıştırdığınızda bir hata oluşursa, sonuç kullanılmamalıdır.

Kullanılan:

Sil

EKLEME

güncelleştirme

BİRLEŞTİRME

Topic link iconTransact-SQL sözdizimi kuralları

<OUTPUT_CLAUSE> ::=
{
    [ OUTPUT <dml_select_list> INTO { @table_variable | output_table } [ ( column_list ) ] ]
    [ OUTPUT <dml_select_list> ]
}
<dml_select_list> ::=
{ <column_name> | scalar_expression } [ [AS] column_alias_identifier ]
    [ ,...n ]

<column_name> ::=
{ DELETED | INSERTED | from_table_name } . { * | column_name }
    | $action

Bağımsız değişkenler

  • @table\_variable
    Belirtir birtabledeğişken, döndürülen satırları eklendiğinde, şu anda geri çağıran.@table\_variablegereken bildirilen önce INSERT, UPDATE, DELETE veya birleştirme deyim.

    Ifcolumn_listbelirtilmemiş,tabledeğişkeni OUTPUT sonucu olarak aynı sayıda sütun olmalıdır küme.Özel durumlar şunlardır: kimlik ve atlanması gereken hesaplanan sütunlar.Ifcolumn_listbelirtilirse, belirtilmemiş sütun null değerlere izin vermek ya varsayılan değerler atanmış.

    Daha fazla bilgitableBkz. değişkenleri,Tablo (Transact-SQL).

  • output_table
    Specifies a table that the returned rows are inserted into instead of being returned to the caller.output_table may be a temporary table.

    Ifcolumn_listbelirtilmemiş, tablo OUTPUT sonuç kümesi. aynı sayıda sütun olmalıdırÖzel durumlar şunlardır: kimlik ve hesaplanan sütunlar.Bu atlanan gerekir.Ifcolumn_listbelirtilirse, belirtilmemiş sütun null değerlere izin vermek ya varsayılan değerler atanmış.

    output_table yapamazsınız:

    • Üzerinde tanımlı Tetikleyiciler etkinleştirmiş olmanız gerekir.

    • yabancı anahtar kısıtlamasının her iki tarafında yer.

    • CHECK) kısıtlamaları olan veya kurallar etkin.

  • column_list
    İsteğe bağlı bir hedef sütun adları listesinden iş tablo INTO yan tümcesi.İzin verilen sütun listesine benzerINSERT deyim.

  • scalar_expression
    Tek bir değer veren herhangi bir bileşimini simgeler ve işleçleri belirtilir.toplamak işlevleri de verilmezscalar_expression.

    Bir sütun başvurusu tablo değiştirilen gerekir tam INSERTED ya da silindi önekiyle.

  • column_alias_identifier
    Bir diğer ad, sütun adını başvurmak için kullanılır.

  • SİLİNMİŞ
    İş değeri güncelleştirme tarafından silinmiş sütun önek ya da silme işlemi.Sütun ile silindi öneki UPDATE, DELETE, önce değeri yansıtır veya birleştirme deyim tamamlandı.

    SİLİNDİ INSERT OUTPUT tümcesinde kullanılamaz deyim.

  • EKLENEN
    Ekleme veya güncelleştirme işlemi tarafından eklenen değeri bir sütun önek belirtilir.INSERTED ile ön sütunları birleştirme, INSERT veya UPDATE deyim tamamlandıktan sonra ancak önce tetikleyici yürütülen değeri yansıtır.

    INSERTED ÇIKIŞI ile birlikte kullanılamaz yan tümce DELETE deyiminde.

  • from_table_name
    Belirten bir sütun öneki mi bir tablo DELETE FROM yan tümcesinde bulunan, UPDATE veya birleştirme güncelleştirmek veya silmek için satırları belirtmek için kullanılan ifade.

    FROM yan tümcesinde tablonun değiştirilmesini de belirtilirse, bu tablonun herhangi bir başvuru INSERTED veya silindi önekiyle uygun olmalıdır.

  • *
    Belirtir, silme, ekleme, veya güncelleştirme eylemini etkilenen tüm sütunları döndürülen sırada, bunlar mevcut tablo.

    Örneğin,OUTPUT DELETED.*Aşağıdaki silme tüm sütunları silinebilir deyim döndürürShoppingCartItemTablo:

    DELETE Sales.ShoppingCartItem
        OUTPUT DELETED.*;
    
  • column_name
    Bir açık bir sütun başvurusu belirtilir.Tüm başvuru tablo değiştirilen gerekir doğru tam INSERTED veya silindi önek uygun, örneğin: EKLENEN **.**column_name.

  • $ eylem
    Yalnızca birleştirme için kullanılabilir durumda deyim.Bir sütun türünü belirtirnvarchar(10)birleştirmede OUTPUT yan tümcesinde deyim her satır için üç değerden birini verir: 'INSERT', 'UPDATE' veya ', gerçekleştirilen bu satırın. eylem uyarınca DELETE'

Remarks

Çıktı<dml_select_list>yan tümce ve çıktı<dml_select_list>INTO { **@**table_variable | output_table} yan tanımlanabilir bir tek INSERT, UPDATE, DELETE veya birleştirme deyimini.

Not

Aksi takdirde, belirtilen sürece OUTPUT yan başvuru başvuru OUTPUT yan tümce ve OUTPUT INTO yan tümce.

The OUTPUT yan tümce kimliği veya hesaplanmış sütun değerinin bir INSERT veya UPDATE işlemi. sonra almak yararlı olabilir

, Hesaplanan bir sütun eklenir<dml_select_list>Tablo değişkeni ve çıktı tablosu karşılık gelen sütun olduğundan hesaplanan sütun değildir.Yeni sütun değerleri deyim yürütüldü anda işlediği değerlerdir.

Değişiklikleri tabloya uygulanma sırası ve siparişi satırları çıktı tablosu veya tablo değişkeni eklenir karşılık gelecek hiçbir garantisi yoktur.

Parametre veya değişken bir UPDATE deyim, çıktı bir parçası olarak değiştirilirse yan tümce her zaman önce değiştirilen değeri yerine yürütülen deyim olduğu gibi parametre veya değişken değerini verir.

OUTPUT WHERE CURRENT OF sözdizimini kullanan bir üzerinde imleç bir UPDATE veya DELETE deyim kullanabilirsiniz.

Çıktı yan tümce aşağıdaki tablolarda desteklenmez:

  • DML deyimlerini, başvuru yerel bölümlenmiş görünümler, dağıtılmış, bölümlenmiş görünümler veya uzak tablo.

  • yürütmek deyim içeren bir INSERT deyimleri.

  • Tam metin koşullarına ÇIKTIDA verilmez yan tümce veritabanı uyumluluk düzey 100 olarak ayarlandığında.

  • OUTPUT INTO yan tümce bir görünüm veya işlev satır kümesi kümesi eklemek için kullanılamaz.

  • Bir OUTPUT INTO içeriyorsa, kullanıcı tanımlı bir işlev oluşturulamıyor yan tümce bir tablo olarak hedefine sahip.

Çıktı nondeterministic davranışı önlemek için yan tümce aşağıdaki başvuru içeremez:

  • Alt sorgular veya kullanıcı tanımlı işlevler, kullanıcı veya sistem veri erişimini gerçekleştirmek veya erişimin gerçekleştirmek için kabul edilir.Kullanıcı tanımlı işlevler, şemaya bağlı değilse, veri erişimini gerçekleştirmek için kabul edilir.

  • Bu sütun aşağıdaki yöntemlerden birini kullanarak tanımlandığında bir görünüm veya satır içi tablo değerli işlev bir sütunu:

    • Alt sorgu.

    • Kullanıcı veya sistem veri erişimi gerçekleştiren veya erişimin gerçekleştirmek için kabul edilir, kullanıcı tanımlı bir işlev.

    • Bir hesaplanan sütun içeren bir kullanıcı tanımlı fonksiyonu, yapan kullanıcı veya sistem veri erişimi, tanımı.

    ZamanSQL ServerÇIKIŞI bir sütun algılar yan tümce, hata 4186 geçirilen.Daha fazla bilgi için bkz:MSSQLSERVER_4186.

Veri ekleme, bir OUTPUT dönen yan tümce tablo içine

Bir iç içe geçmiş bir INSERT OUTPUT yan sonuçlar yakalarken, UPDATE, DELETE, veya deyim BİRLEŞTİRMEK ve bu sonuçlar hedef tabloya ekleme, aşağıdaki bilgileri göz önünde bulundurun:

  • Tüm işlem atomik olur.INSERT deyim hem de OUTPUT yan tümce içeren iç içe DML deyimini yürütmek ya da tam deyim başarısız olur.

  • Dış INSERT deyim hedefe aşağıdaki kısıtlamalar geçerlidir:

    • Hedef, bir uzak tablo, görünüm veya genel tablo ifade olamaz.

    • Hedef yabancı anahtar kısıtlaması olamaz veya bir yabancı anahtar kısıtlaması tarafından başvurulan.

    • Tetikleyiciler hedef tanımlanamaz.

    • Birleştirme çoğaltma ya da güncellenebilir abonelik işlemsel kopyalama için hedef alamaz.

  • İç içe DML deyim için uygulanacak kısıtlamalar:

    • Hedef, bir uzak tablo ya da bölümlenmiş görünüm olamaz.

    • Kaynak kendini içeremez bir<dml_table_source>yan tümce.

  • INTO OUTPUT yan tümce içeren INSERT deyimleri desteklenmeyen bir<dml_table_source>yan tümce.

  • @@ ROWCOUNT, yalnızca dış INSERT deyim ile eklenen satır döndürür.

  • @@ IDENTITY, SCOPE_IDENTITY, IDENT_CURRENT, yalnızca iç içe DML deyim ile oluşturulan kimlik değerlerini ve olanları dış INSERT deyim ile oluşturulan verir.

  • Sorgu bildirimleri deyim tek bir varlık olarak kabul ve dış INSERT deyim kendisini önemli değişiklik olsa bile, oluşturulan tüm ileti türünü iç içe DML, türü olacaktır.

  • ,<dml_table_source>yan tümce, SELECT ve WHERE yan tümcesini içeremez alt toplamak işlevleri, sıralama işlev, tam metin yüklemler, kullanıcı tanımlı işlevleri gerçekleştiren veri erişimi veya TEXTPTR işlev.

Tetikleyiciler

OUTPUT döndürülen sütun olarak INSERT sonra UPDATE veya DELETE deyim tamamlandı ancak Tetikleyiciler yürütülen önce verileri yansıtacak.

INSTEAD OF Tetikleyicileri, INSERT, UPDATE veya DELETE gerçekte gibi oluştuysa, döndürülen sonuçlar oluşturulan için bile değişikliğe tetikleyici işleminin sonucu gerçekleşir.Tetikleyici gövdesi içinde kullanılan bir OUTPUT yan tümce içeren bir deyim, tablo diğer adları tetikleyici eklenen ve silinen çoğaltma INSERTED içeren sütun başvuruları önlemek için tablolar ve OUTPUT ile ilişkili tabloları DELETED başvurusu için kullanılmalıdır.

Çıktı yan tümce de INTO anahtar sözcüğü, DML işleminin hedef belirleme verilen DML eylem için tanımlanmış tüm etkin tetikleyici sahip olmayan belirtilir.Örneğin, hedef bir UPDATE deyim içinde tanımlanan OUTPUT yan tümceni, tablo herhangi UPDATE tetikleyicisi etkinleştirdiyseniz olamaz.

Sp_configure seçeneğini engellemek Tetikleyiciler sonuçlar ayarlanmışsa, bir INTO yan tümce içermeyen bir OUTPUT yan tümcesini deyim, gelen bir tetikleyici içinde çağrıldığında başarısız olmasına neden olur.

Veri Türleri

The OUTPUT yan tümce büyük nesne veri türleri destekler: nvarchar(max),varchar(max),varbinary(max), text,ntext,image, andxml.Güncelleştirme pucu yan tümcesi kullandığınızda deyim değiştirmek için birnvarchar(max),varchar(max), orvarbinary(max)sütun, önceki ve sonraki değeri görüntüler tam verilen referansta bulunulur,.TEXTPTR () işlev, ifade parçası olarak bulunamaz birtext,ntext, orimagesütun OUTPUT yan tümce.

Sıraları

Ara sonuç kümelerini veya tablo sırası olarak kullanan uygulamalarda OUTPUT kullanabilirsiniz.Diğer bir deyişle, uygulama sürekli olarak ekleme veya satırları kaldırma tablo.Aşağıdaki örnek, çıktı kullanır yan tümce silinmiş satırı arama uygulamaya dönmek için DELETE deyim içinde.

Bu örnek, bir satırdan kaldırır bir tablo sırası olarak kullanılan ve tek bir eylem işleme uygulamasında silinmiş değerleri döndürür.Diğer semantik da, bir yığın uygulamak için tablo kullanma gibi uygulanabilir.Bununla birlikte,SQL Server, satır işlenir ve çıktı kullanarak DML deyimlerini tarafından döndürülen sırasını garanti etmez yan tümce.Bu istenen semantik garanti veya birden çok satır DML işlemi için uygun, olduğunu anlamak bir uygun WHERE yan tümce eklemek için uygulama kadar hiçbir garantili sıradır.Aşağıdaki örnek, alt sorgu kullanır ve benzersiz bir özelliği olduğunu varsayarDatabaseLogIDsütun için uygulamak istediğiniz sıralama kurallarına.

Not

Bir tablodan bir yıkıcı okuma yapmak birden çok uygulama senaryonuz sağlar, READPAST tablo İpucu UPDATE ve DELETE deyimlerinde kullanın.Kilitleme engeller alınmış olabilir, başka bir uygulama zaten ilk uygun okuma sorunları tabloyu kaydedin.

İzinler

SELECT izni yoluyla alınan tüm sütunlar gereklidir<dml_select_list>veya<scalar_expression>.

İçindeki tüm tabloları, gerekli izinleri Ekle<output_table>.

Örnekler

C.OUTPUT INTO basit bir INSERT deyim ile kullanma

The following example inserts a row into the ScrapReason table and uses the OUTPUT clause to return the results of the statement to the @MyTableVartable variable.İçinScrapReasonIDsütunu bir IDENTITY özellik ile tanımlanmış, bir değer olarak belirtilmemişINSERTTablo, sütun.Değeri tarafından üretilen ancak, NotDatabase Enginesütun iade içinOUTPUTyan tümcesindeki sütunINSERTED.ScrapReasonID.

B.DELETE deyim OUTPUT kullanma

Aşağıdaki örnek, tüm satırları silerShoppingCartItemTablo.Yan tümceOUTPUT DELETED.*belirleyen sonuçlar,DELETEdeyim, silinmiş satırlar, tüm sütunları olan arama uygulaması. döndürdüThe SELECT statement that follows verifies the results of the delete operation on the ShoppingCartItem table.

C.OUTPUT INTO bir UPDATE deyim ile kullanma

Aşağıdaki örnek güncelleştirmeleriVacationHourssütun,EmployeeTablo 25 oranında ilk 10 satırı.The OUTPUT clause returns the VacationHours value that exists before applying the UPDATE statement in the column DELETED.VacationHours, and the updated value in the column INSERTED.VacationHours to the @MyTableVartable variable.

İkiSELECTdeyimlerini izleyin, dönüş değerleri@MyTableVarve güncelleştirme işlemi sonuçlarınıEmployeeTablo.sonuçlar NotINSERTED.ModifiedDatesütun olmayan değerler aynıModifiedDatesütunundaEmployeeTablo.Bu, çünkü birAFTER UPDATETetik değerini güncelleştirirModifiedDategeçerli tarih olarak tanımlananEmployeeTablo.Ancak, sütunları döndürülenOUTPUTTetikleyicileri harekete önce verileri göstermek.

D.ifade geri dönmek için OUTPUT INTO kullanma

Tanımlayarak, aşağıdaki örnekte C örneği temel oluşturur bir ifade,OUTPUTgüncelleştirilmiş arasındaki fark olarak yanVacationHoursdeğeri,VacationHoursgüncelleştirme uygulanmadan önceki değeri.The value of this expression is returned to the @MyTableVartable variable in the column VacationHoursDifference.

E.OUTPUT INTO from_table_name içinde bir UPDATE deyim kullanarak

Aşağıdaki örnek güncelleştirmeleriScrapReasonID sütun,WorkOrderTablo ile belirtilen tüm iş siparişleriProductIDveScrapReasonID.The OUTPUT INTO clause returns values from the table being updated (WorkOrder) and also from the Product table.The Product table is used in the FROM clause to specify the rows to update.İçinWorkOrdertablosunda birAFTER UPDATEüzerinde tanımlı tetikleyiciINTOanahtar gereklidir.

F.OUTPUT INTO, DELETE deyim from_table_name kullanma

Aşağıdaki örnekte, satır silinirProductProductPhototanımlanan arama ölçütleri temel tabloFROMyan tümce ofDELETEdeyim.The OUTPUT clause returns columns from the table being deleted (DELETED.ProductID, DELETED.ProductPhotoID) and columns from the Product table.Bu tablo kullanılırFROMyan tümce için satırları silme.

G.OUTPUT INTO büyük nesne veri türü ile kullanma

Aşağıdaki örnek, kısmi bir değerin güncelleştirirDocumentSummary, annvarchar(max)sütunundaProduction.Documentkullanarak tablo,.WRITEyan tümce.Sözcükcomponentssözcüğü ile değiştirilirfeaturesYeni sözcük, sözcük varolan verileri ve karakter değiştirildi (uzunluk) olarak değiştirilecek başlangıç konumu (ofset) belirterek.The example uses the OUTPUT clause to return the before and after images of the DocumentSummary column to the @MyTableVartable variable.Dikkat tam önce ve sonra resimleriDocumentSummarysütun döndürdü.

H.OUTPUT bir INSTEAD OF tetikleyicisi kullanma

Aşağıdaki örnekOUTPUTsonuçlar döndürmek için bir tetikleyici yan tetikleyici operasyon.İlk olarak, bir görünüm oluşturulurScrapReasonTablo ve birINSTEAD OF INSERTTetikleyici tanımlı, yalnızca görünümNamesütun tablonun temel değiştiren kullanıcı.İçin sütunScrapReasonIDolan birIDENTITYtemel sütununda tablo, tetikleyici kullanıcı tarafından sağlanan değerin. yoksayarBöyleceDatabase Engineiçin otomatik olarak oluşturmak doğru değeri.Ayrıca, değer için kullanıcı tarafından sağlananModifiedDategöz ardı edilir ve küme geçerli tarih.The OUTPUT clause returns the values actually inserted into the ScrapReason table.

USE AdventureWorks;
GO
IF OBJECT_ID('dbo.vw_ScrapReason','V') IS NOT NULL
    DROP VIEW dbo.vw_ScrapReason;
GO
CREATE VIEW dbo.vw_ScrapReason
AS (SELECT ScrapReasonID, Name, ModifiedDate
    FROM Production.ScrapReason);
GO
CREATE TRIGGER dbo.io_ScrapReason 
    ON dbo.vw_ScrapReason
INSTEAD OF INSERT
AS
BEGIN
--ScrapReasonID is not specified in the list of columns to be inserted 
--because it is an IDENTITY column.
    INSERT INTO Production.ScrapReason (Name, ModifiedDate)
        OUTPUT INSERTED.ScrapReasonID, INSERTED.Name, 
               INSERTED.ModifiedDate
    SELECT Name, getdate()
    FROM inserted;
END
GO
INSERT vw_ScrapReason (ScrapReasonID, Name, ModifiedDate)
VALUES (99, N'My scrap reason','20030404');
GO

İşte 12 Nisan 2004'te, oluşturulan sonuç kümesi (' 2004-04-12').DikkatScrapReasonIDActualveModifiedDatesütun sağlanan değerler yerine tetiği işlemi tarafından oluşturulan değerleri yansıtacakINSERTdeyim.

ScrapReasonID adı ModifiedDate

-------------  ---------------- -----------------------

17 Benim hurda neden 2004-04-12 16:23:33.050

I.OUTPUT INTO kimlik ve hesaplanan sütunlar ile kullanma

Aşağıdaki örnek oluştururEmployeeSalesTablo ve birden fazla satır kullanma mikrofona ekleyen birINSERTdeyim ile birSELECTkaynak tablolar. veri almak için bildirimiThe EmployeeSales table contains an identity column (EmployeeID) and a computed column (ProjectedSales).Tarafından üretilen bu değerler içinSQL Server Database Engineekleme işlemi sırasında bu sütunların hiçbiri tanımlanabilir@MyTableVar.

J.Tek bir deyimde OUTPUT ve OUTPUT INTO kullanma

Aşağıdaki örnekte, satır silinirProductProductPhototanımlanan arama ölçütleri temel tabloFROMyan tümce ofDELETEdeyim.The OUTPUT INTO clause returns columns from the table being deleted (DELETED.ProductID, DELETED.ProductPhotoID) and columns from the Product table to the @MyTableVartable variable.The Product table is used in the FROM clause to specify the rows to delete.The OUTPUT clause returns the DELETED.ProductID, DELETED.ProductPhotoID columns and the date and time the row was deleted from the ProductProductPhoto table to the calling application.

K.Bir OUTPUT yan tümce döndürülen veri ekleme

Aşağıdaki örnek, döndürülen verileri yakalayanOUTPUTyan birMERGEdeyim ve bu verileri başka bir tablo. eklerThe MERGE statement updates the Quantity column of the ProductInventory table daily, based on orders that are processed in the SalesOrderDetail table.Bu da siler satır ürünleri, stoklar bırakmak için0veya altı.Bu örnek satır silinir, yakalar ve başka bir tabloya eklerZeroInventoryizleyen ürünleri hiçbir stok.