Aracılığıyla paylaş


output Yantümcesi (Transact-sql)

Bilgilerini, veya temel ifadeler, INSERT, update, delete veya birleştirme bir deyim tarafından etkilenen her satır döndürür. 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. Sonuçları da bir tablo veya tablo değişkeni içine eklenebilir. Ayrıca, bir output yan tümcesinde iç içe INSERT, update, delete, sonuçlarını yakalamak veya deyimi BİRLEŞTİRMEK ve bu sonuçları hedef tablo veya Görünüm yerleştirin.

[!NOT]

Bile ifade hataları karşılaştığında ve geri alınır bir update, INSERT veya delete deyimi output yan tümcesi içeren satırları istemciye döndürür. Deyimi çalıştırdığınızda herhangi bir hata oluşursa, sonuç kullanılmamalıdır.

Kullanılan:

DELETE

EKLE

GÜNCELLEŞTİRME

BİRLEŞTİRME

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

Sözdizimi

<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 bir tabledöndürülen satırların çağırana döndürülen yerine eklenir değişken. @table\_variable INSERT, update, delete veya birleştirme deyimini önce bildirilmelidir.

    Eğer column_listbelirtilmemiş, tabledeğişken çıkış sonuç kümesi aynı sayıda sütun olması gerekir. İstisnalar, kimlik ve atlanır olabilir hesaplanmış sütunları vardır. Eğer column_listbelirtilen, belirtilmemiş sütun boş değerlere izin vermek veya varsayılan değerler atanmış.

    Hakkında daha fazla bilgi için tablebkz: değişkenleri, Tablo (Transact-sql).

  • output_table
    Döndürülen satırları çağırana döndürülen yerine eklenir bir tablosunu belirtir. output_tablegeçici bir tablo olabilir.

    Eğer column_listbelirtilmezse, tablo çıkış sonuç kümesi aynı sayıda sütun olması gerekir. İstisnalar, kimlik ve hesaplanan sütunlar vardır. Bunlar atlanan gerekir. Eğer column_listbelirtilen, belirtilmemiş sütun boş değerlere izin vermek veya varsayılan değerler atanmış.

    output_tableyapamazsınız:

    • Üzerinde tanımlı Tetikleyiciler etkinleştirdiniz.

    • FOREIGN key kısıtlaması her iki tarafında katılın.

    • Kuralları etkin veya check kısıtlamaları vardır.

  • column_list
    INTO yan hedef tablodaki sütun adları isteğe bağlı bir listedir. İzin sütun listesine benzerdir Ekle deyimi.

  • scalar_expression
    Tek bir değeri değerlendiren tüm semboller ve operatörler birleşimidir. Toplama işlevleri de izin verilmez scalar_expression.

    Değiştirilen tablosundaki sütunlar için herhangi bir başvuru INSERTED veya deleted önekiyle nitelenmiş gerekir.

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

  • SİLİNMİŞ
    Bir sütun öneki güncelleştirme tarafından silinmiş değerini belirtir veya silme işlemi. Sütunları ile SİLİNEN öneki yansıtacak değer önce update, delete veya BIRLEŞTIRME deyimini tamamlandığında.

    deleted INSERT deyiminde output yan tümcesi ile kullanılamaz.

  • EKLENEN
    INSERT veya update işlemi tarafından katma değer belirtir bir sütun önektir. Sütunları ile INSERTED öneki, update, INSERT veya birleştirme deyimini tamamlandığında ancak Tetikleyiciler yürütülen önce değeri yansıtır.

    INSERTED delete deyiminde output yan tümcesi ile kullanılamaz.

  • from_table_name
    Güncelleştirilecek veya silinecek satırları belirtmek için kullanılan delete, update veya birleştirme deyiminin from yan tümcesinde dahil tablosunu belirtir bir sütun önektir.

    Değiştirilmesini tablo from yan tümcesinde de belirtilirse, bu tablodaki sütunlar için herhangi bir başvuru INSERTED veya deleted önekiyle nitelenmiş gerekir.

  • *
    Delete, INSERT veya güncelleştirme eylem tarafından etkilenen tüm sütunları olan tabloda mevcut sırayla döndürülür belirtir.

    Örneğin, OUTPUT DELETED.*Aşağıdaki delete deyimi döndürür tüm sütunlar, gruptan silinecek ShoppingCartItemtablosu:

    DELETE Sales.ShoppingCartItem
        OUTPUT DELETED.*;
    
    DELETE Sales.ShoppingCartItem
        OUTPUT DELETED.*;
    
  • column_name
    Açık sütun başvurusu. Değiştirilmesini tablo herhangi bir referans düzgün eklenen ya da SİLİNEN önek uygun, örneğin kalifiye olmalıdır: eklenen**.**column_name.

  • $Eylem
    BIRLEŞTIRME deyimi yalnızca için kullanılabilir. Bir sütun türü belirtir nvarchar(10)içindeki her satır için üç değerden birini döndüren BIRLEŞTIRME deyimini output yan tümcesi içinde: 'Ekle', 'Güncelleştirme' veya 'Sil, bu satıra gerçekleştirildi eyleme göre'.

Açıklamalar

ÇIKTI <dml_select_list> yan tümcesi ve çıkış <dml_select_list> Into { **@**table_variable | output_table} yan tek bir INSERT, update, delete veya birleştirme deyiminde tanımlanabilir.

[!NOT]

Aksi belirtilmediği sürece output yan tümcesi output yan tümcesi ve output INTO yan bakın.

output yan tümcesi, bir INSERT veya update işlemi sonrasında kimliği veya hesaplanmış sütunları değerini almak için yararlı olabilir.

Ne zaman hesaplanmış bir sütun dahil <dml_select_list>, çıkış tablo veya tablo değişkeni karşılık gelen sütun hesaplanan bir sütun değil. Yeni sütunundaki değerler hesaplanan deyimi yürütüldü zaman değerlerdir.

Hiçbir garantisi yok ki değişiklikleri tabloya uygulandığı sipariş ve sipariş satırları çıktı tablo veya tablo değişkeni eklenir karşılık gelir.

Parametre veya değişken bir update deyimi bir parçası olarak değiştirdiyseniz, değiştirilen değeri yerine yürütülen deyimi öncesinde olduğu gibi output yan tümcesi her zaman parametre veya değişken değeri döndürür.

where current of sözdizimini kullanan bir imleç konumlandırılmış bir update veya delete deyimi ile çıkış kullanabilirsiniz.

output yan tümcesi aşağıdaki deyimleri desteklenmez:

  • 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.

  • execute deyimi içeren INSERT deyimleri.

  • Tam metin yüklemler içinde izin verilmez output yan tümcesi ne zaman veritabanı uyumluluk düzeyi 100 olarak ayarlanır.

  • output INTO yan görünüm veya satır kümesi işlevi eklemek için kullanılamaz.

  • Bir tablo, hedef olarak bir output INTO yan içeriyorsa, kullanıcı tanımlı bir işlev oluşturulamıyor.

Nondeterministic davranışı engellemek için output yan tümcesi aşağıdaki başvuru içeremez:

  • Alt sorgular veya kullanıcı tanımlı işlevler, kullanıcı veya sistem veri erişimi gerçekleştiren veya böyle yapmak için kabul edilir. Kullanıcı tanımlı işlevler, şemaya bağlı değillerse, veri erişimi gerçekleştirmek için kabul edilir.

  • Bu sütuna 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 ya da böyle yapmak için kabul edilir bir kullanıcı tanımlı işlevi.

    • Kullanıcı veya sistem veri erişimi, tanımında gerçekleştiren kullanıcı tanımlı bir işlev içeren bir hesaplanan sütun.

    Ne zaman SQL Serverböyle bir sütunu algılar output yan tümcesinde hata 4186 oluşturulur. Daha fazla bilgi için, bkz. MSSQLSERVER_4186.

Yan döndürülen tablo ekleme veri

Bir output yan tümcesinde iç içe geçmiş bir INSERT sonuçlarını yakalarken, GÜNCELLEŞTİRMEK, silmek, veya deyimi birleştirme ve bu sonuçların bir hedef tabloya ekleme, aşağıdaki bilgileri göz önünde bulundurun:

  • Tüm atom işlemidir. INSERT deyimi ve output yan tümcesi içeren iç içe dml deyimi yürütme ya da bütün deyimi başarısız olur.

  • Dış INSERT deyimi hedef için aşağıdaki kısıtlamalar geçerlidir:

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

    • Hedef FOREIGN key kısıtlaması olamaz veya FOREIGN key kısıtlaması tarafından başvurulan.

    • Tetikleyiciler hedef tanımlanamaz.

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

  • İç içe dml deyimi aşağıdaki kısıtlamalar geçerlidir:

    • Bir uzak tablo veya Bölümlenmiş görünümün hedefi olamaz.

    • Kaynak içeremez bir <dml_table_source> tümcesi.

  • output INTO yan içeren INSERT deyimleri desteklenmez bir <dml_table_source> tümcesi.

  • @@ rowcount yalnızca dış INSERT deyimi tarafından eklenen satır döndürür.

  • Yalnızca iç içe dml deyimi tarafından oluşturulan kimlik değerleri ve bu dış INSERT deyimi tarafından oluşturulan @@ IDENTITY, SCOPE_IDENTITY ve IDENT_CURRENT dönün.

  • Sorgu bildirimleri deyimi tek bir varlık gibi davranın ve dış INSERT deyimi kendisi önemli bir değişiklik olsa bile oluşturulan herhangi bir ileti türünü iç içe dml türü olacaktır.

  • İçinde <dml_table_source> yan tümcesi select ve where yan tümceleri alt sorgular, toplama işlevleri, sıralama fonksiyonları, tam metin yüklemler, veri erişimi gerçekleştiren kullanıcı tanımlı işlevler veya textptr işlevi içeremez.

Tetikleyicileri

ÇIKTISI döndürülen sütunlar, o sonra INSERT, update veya delete deyimi tamamlandı ancak Tetikleyiciler yürütülen önce verileri yansıtır.

Gibi INSERT, update veya delete aslında gerçekleşmişti INSTEAD OF Tetikleyicileri, döndürülen sonuçlar üretilir için bile değişikliğe tetiği işlemi sonucunda gerçekleşecek. output yan tümcesi içeren bir deyimi tetikleyici gövdesi içinde kullanılırsa, tablo diğer adları tetikleyici başvuruda bulunmak için kullanılması gereken insertedve deletedtabloları INSERTED ve deleted tablolardaki çıktı ile ilişkili sütun başvuruları Çoğaltma kaçınmak için.

INTO anahtar sözcüğü de belirtmeden output yan tümcesi belirtilirse, belirli dml eylem için tanımlanmış etkin herhangi bir tetikleyici dml işleminin hedefi olamaz. Örneğin, output yan tümcesi bir update deyimi içinde tanımlıysa, hedef tablo herhangi bir etkin update Tetikleyiciler olamaz.

Eğer sp_configureseçeneği disallow results from triggersayarlanır, output yan tümcesi INTO yan deyimi daha--dan bir tetikleyici içinde çağrıldığında başarısız olmasına neden olmadan.

Veri Türleri

output yan tümcesi büyük nesne veri türleri destekler: nvarchar(max), varchar(max), varbinary(max), text, ntext, image, ve xml. Ne zaman kullanılır.YAZMA yan tümcesinde değiştirmek için update deyimi bir nvarchar(max), varchar(max), veya varbinary(max)sütun, önce ve sonra görüntü değerleri tam onlar başvurulan döndü. Bir ifadenin parçası olarak textptr () işlevi görünür değil bir text, ntext, ya imageoutput yan sütunda.

Sıraları

ÇIKIŞ sıraları tablolar kullanan uygulamalarda kullanabileceğiniz veya ara sonuç tutmak için ayarlar. Başka bir deyişle, uygulama sürekli ekleme veya tablodan satır kaldırmak. Aşağıdaki örnek, silinmiş satırı arama uygulamaya dönmek için delete deyiminde output yan tümcesi kullanır.

USE AdventureWorks2012;
GO
DELETE TOP(1) dbo.DatabaseLog WITH (READPAST)
OUTPUT deleted.*
WHERE DatabaseLogID = 7;
GO

Bu örnek, bir sıra kullanılan bir tablodan satır kaldırır ve tek bir eylem işleme uygulamaya silinen değerleri döndürür. Diğer anlamı da, bir yığın uygulamak için tablo kullanma gibi uygulanabilir. Ancak, SQL Serverhangi satırların işlenir ve output yan tümcesi kullanarak dml deyimleri tarafından döndürülen siparişi garantilemez. Bu istenen semantiği garanti veya birden çok satır dml işlemi için hak olabilir zaman orada olduğunu anlamak uygun bir where yan tümcesi eklemek için hiçbir garanti siparişi uygulamasıdır. Aşağıdaki örnek, bir sorgu kullanır ve benzersiz bir özelliği olduğunu varsayar DatabaseLogIDİstenen sıralama semantiği uygulamak için sütun.

USE tempdb;
GO

CREATE TABLE dbo.table1
(
    id INT,
    employee VARCHAR(32)
)
go

INSERT INTO dbo.table1 VALUES 
      (1, 'Fred')
     ,(2, 'Tom')
     ,(3, 'Sally')
     ,(4, 'Alice');
GO

DECLARE @MyTableVar TABLE
(
    id INT,
    employee VARCHAR(32)
);

PRINT 'table1, before delete' 
SELECT * FROM dbo.table1;

DELETE FROM dbo.table1
OUTPUT DELETED.* INTO @MyTableVar
WHERE id = 4 OR id = 2;

PRINT 'table1, after delete'
SELECT * FROM dbo.table1;

PRINT '@MyTableVar, after delete'
SELECT * FROM @MyTableVar;

DROP TABLE dbo.table1;

--Results
--table1, before delete
--id          employee
------------- ------------------------------
--1           Fred
--2           Tom
--3           Sally
--4           Alice
--
--table1, after delete
--id          employee
------------- ------------------------------
--1           Fred
--3           Sally
--@MyTableVar, after delete
--id          employee
------------- ------------------------------
--2           Tom
--4           Alice

[!NOT]

Senaryo bir tablodan bir yıkıcı okuma gerçekleştirmek birden çok uygulama için izin veriyorsa, update ve delete deyimlerinde readpast tablo ipucu kullanın. Bu kilitlenmesini önler başka bir uygulama zaten Birinci eleme okuma gelip sorunlar tablosunda kayıt.

İzinler

select izinleri aracılığıyla alınan tüm sütunlar üzerinde gerekli <dml_select_list> ya da kullanılan <scalar_expression>.

INSERT izinleri tüm tablolarda belirtilen gerekli <output_table>.

Örnekler

A.output INTO basit bir INSERT deyimi ile kullanma

Aşağıdaki örnek bir satır ekler ScrapReasontablo ve uses OUTPUTdeyimi sonuçları döndürmek için yan @MyTableVar tabledeğişkeni. Çünkü ScrapReasonIDsütun IDENTITY özelliği ile tanımlanan, bir değer belirtilmemiş INSERTo sütunun deyimini. Ancak, tarafından oluşturulan değeri not Veritabanı Altyapısıiçin bu sütunu iade OUTPUTyan tümcesinde sütunu inserted.ScrapReasonID.

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ış delete deyimi ile kullanma

Aşağıdaki örnek, tüm satırları siler ShoppingCartItemtablosu. Yan OUTPUT deleted.*belirten sonuçlarını DELETEtüm sütunlar silinmiş satırlar, deyimi, çağıran uygulama iade. SELECTAşağıdaki deyimi üzerinde silme işlemi sonucunu doğrular ShoppingCartItemtablosu.

USE AdventureWorks2012;
GO
DELETE Sales.ShoppingCartItem
OUTPUT DELETED.* 
WHERE ShoppingCartID = 20621;

--Verify the rows in the table matching the WHERE clause have been deleted.
SELECT COUNT(*) AS [Rows in Table] FROM Sales.ShoppingCartItem WHERE ShoppingCartID = 20621;
GO

C.output INTO bir update deyimi ile kullanma

Aşağıdaki örnek güncelleştirmeleri VacationHourssütununda Employeeiçin ilk 10 satırı yüzde 25 tarafından tablo. OUTPUTYan tümcesi döndürür VacationHoursuygulamadan önce varolan değeri UPDATEdeyimi sütun deleted.VacationHoursve güncelleştirilmiş değeri sütununda inserted.VacationHoursiçin @MyTableVar tabledeğişkeni.

İki SELECTBu değerleri dönmek deyimleri takip @MyTableVarve güncelleştirme işleminin sonuçlarını Employeetablosu.

USE AdventureWorks2012;
GO
DECLARE @MyTableVar table(
    EmpID int NOT NULL,
    OldVacationHours int,
    NewVacationHours int,
    ModifiedDate datetime);
UPDATE TOP (10) HumanResources.Employee
SET VacationHours = VacationHours * 1.25,
    ModifiedDate = GETDATE() 
OUTPUT inserted.BusinessEntityID,
       deleted.VacationHours,
       inserted.VacationHours,
       inserted.ModifiedDate
INTO @MyTableVar;
--Display the result set of the table variable.
SELECT EmpID, OldVacationHours, NewVacationHours, ModifiedDate
FROM @MyTableVar;
GO
--Display the result set of the table.
SELECT TOP (10) BusinessEntityID, VacationHours, ModifiedDate
FROM HumanResources.Employee;
GO

D.Deyim döndürmek için output INTO kullanma

Aşağıdaki örnek, bir ifade tanımlayarak örnek c oluşturur OUTPUTgüncelleştirilmiş arasındaki fark olarak yan VacationHoursdeğeri ve VacationHoursgüncelleştirme uygulanmadan değer. Bu ifadenin değeri döndürülür @MyTableVar tabledeğişken sütun VacationHoursDifference.

USE AdventureWorks2012;
GO
DECLARE @MyTableVar table(
    EmpID int NOT NULL,
    OldVacationHours int,
    NewVacationHours int,
    VacationHoursDifference int,
    ModifiedDate datetime);
UPDATE TOP (10) HumanResources.Employee
SET VacationHours = VacationHours * 1.25,
    ModifiedDate = GETDATE()
OUTPUT inserted.BusinessEntityID,
       deleted.VacationHours,
       inserted.VacationHours,
       inserted.VacationHours - deleted.VacationHours,
       inserted.ModifiedDate
INTO @MyTableVar;
--Display the result set of the table variable.
SELECT EmpID, OldVacationHours, NewVacationHours, 
    VacationHoursDifference, ModifiedDate
FROM @MyTableVar;
GO
SELECT TOP (10) BusinessEntityID, VacationHours, ModifiedDate
FROM HumanResources.Employee;
GO

E.output INTO from_table_name içinde bir update deyimi ile kullanma

Aşağıdaki örnek güncelleştirmeleri ScrapReasonID sütununda WorkOrderiçin tüm iş emirleri ile belirtilen bir tablo ProductIDve ScrapReasonID. OUTPUT INTOYan tümcesi, güncelleştirilen tablodan değerleri döndürür (WorkOrder) ve de Producttablosu. ProductTablo içinde kullanılan FROMgüncelleştirilecek satırları belirtmek için yan. Çünkü WorkOrdertablo bir AFTER UPDATEtetikleyici tanımlanmış, INTOanahtar gereklidir.

USE AdventureWorks2012;
GO
DECLARE @MyTestVar table (
    OldScrapReasonID int NOT NULL, 
    NewScrapReasonID int NOT NULL, 
    WorkOrderID int NOT NULL,
    ProductID int NOT NULL,
    ProductName nvarchar(50)NOT NULL);
UPDATE Production.WorkOrder
SET ScrapReasonID = 4
OUTPUT deleted.ScrapReasonID,
       inserted.ScrapReasonID, 
       inserted.WorkOrderID,
       inserted.ProductID,
       p.Name
    INTO @MyTestVar
FROM Production.WorkOrder AS wo
    INNER JOIN Production.Product AS p 
    ON wo.ProductID = p.ProductID 
    AND wo.ScrapReasonID= 16
    AND p.ProductID = 733;
SELECT OldScrapReasonID, NewScrapReasonID, WorkOrderID, 
    ProductID, ProductName 
FROM @MyTestVar;
GO

F.output INTO from_table_name içinde bir delete deyimi kullanarak

Aşağıdaki örnek, satır siler ProductProductPhototabloda tanımlanan arama ölçütleri temel FROMyan DELETEdeyimi. OUTPUTYan tümcesi döndürür sütun siliniyor tablodan (deleted.ProductID, deleted.ProductPhotoID) ve sütunlarından Producttablosu. Bu tablo kullanılır FROMsilinecek satırları belirtmek için yan.

USE AdventureWorks2012;
GO
DECLARE @MyTableVar table (
    ProductID int NOT NULL, 
    ProductName nvarchar(50)NOT NULL,
    ProductModelID int NOT NULL, 
    PhotoID int NOT NULL);

DELETE Production.ProductProductPhoto
OUTPUT DELETED.ProductID,
       p.Name,
       p.ProductModelID,
       DELETED.ProductPhotoID
    INTO @MyTableVar
FROM Production.ProductProductPhoto AS ph
JOIN Production.Product as p 
    ON ph.ProductID = p.ProductID 
    WHERE p.ProductModelID BETWEEN 120 and 130;

--Display the results of the table variable.
SELECT ProductID, ProductName, ProductModelID, PhotoID 
FROM @MyTableVar
ORDER BY ProductModelID;
GO

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

Aşağıdaki örnek, kısmi bir değerle güncelleştirir DocumentSummary, bir nvarchar(max)sütununda Production.Documenttabloyu kullanarak, .WRITEyan. Kelime componentssözcüğü yerine featuresbelirterek yerine word, Word'ün varolan verileri ve değiştirilen (uzunluk) için karakter sayısı yerine başlangıç konumunu (ofset). Örnek OUTPUTdönmek için yan öncesi ve sonrası görüntüleri DocumentSummary sütun @MyTableVar tabledeğişkeni. Not önce ve sonra görüntüleri tam DocumentSummarysütun döndürdü.

USE AdventureWorks2012;
GO
DECLARE @MyTableVar table (
    SummaryBefore nvarchar(max),
    SummaryAfter nvarchar(max));
UPDATE Production.Document
SET DocumentSummary .WRITE (N'features',28,10)
OUTPUT deleted.DocumentSummary, 
       inserted.DocumentSummary 
    INTO @MyTableVar
WHERE Title = N'Front Reflector Bracket Installation';
SELECT SummaryBefore, SummaryAfter 
FROM @MyTableVar;
GO

H.ÇIKIŞ bir INSTEAD of Tetikleyici kullanma

Aşağıdaki örnek OUTPUTyan tümcesinde tetikleyici işlemin sonuçları döndürmek için bir tetikleyici. İlk olarak, görünüm oluşturulur ScrapReasontablo ve sonra bir INSTEAD OF INSERTtetikleyici tanımlanmış biricik lets görünümü Namekullanıcı tarafından değiştirilmesi için temel tablo sütun. Çünkü sütun ScrapReasonIDolan bir IDENTITYsütun temel tablo, tetikleyici, kullanıcı tarafından sağlanan değer yoksayar. Böylece, Veritabanı Altyapısıotomatik olarak doğru değer üretmek için. Ayrıca, kullanıcı tarafından sağlanan değeri ModifiedDatedikkate alınmaz ve geçerli tarih olarak ayarlanır. OUTPUTYan tümcesi verir aslında eklenen değerleri ScrapReasontablosu.

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

12 Nisan 2004 tarihinde oluşturulan sonuç kümesi ('2004-04-12'). Fark ScrapReasonIDActualve ModifiedDatesütunları yansıtacak sağlanan değerler yerine tetiği işlemi tarafından oluşturulan değerler INSERTdeyimi.

ScrapReasonID  Name             ModifiedDate

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

17             My scrap reason  2004-04-12 16:23:33.050

I.output INTO kullanarak kimlik ve hesaplanan sütunları

Aşağıdaki örnek oluşturur EmployeeSalestablo ve birkaç satır kullanarak bunun içine ekleyen bir INSERTdeyimi ile bir SELECTkaynak tablodan veri almak için deyimi. EmployeeSalesTablonun kimlik sütunu içeren (EmployeeID) ve hesaplanmış bir sütun (ProjectedSales). Çünkü bu değerler tarafından oluşturulan SQL Server 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

J.Tek bir deyimi içinde çıktı ve output INTO kullanma

Aşağıdaki örnek, satır siler ProductProductPhototabloda tanımlanan arama ölçütleri temel FROMyan DELETEdeyimi. OUTPUT INTOYan tümcesi döndürür sütun siliniyor tablodan (deleted.ProductID, deleted.ProductPhotoID) ve sütunlarından Productiçin tablo @MyTableVar tabledeğişkeni. ProductTablo içinde kullanılan FROMsilinecek satırları belirtmek için yan. OUTPUTYan tümcesi döndürür deleted.ProductID, deleted.ProductPhotoIDsütunlar ve Tarih ve saati satır silindi dan ProductProductPhotoçağıran uygulama tablo.

USE AdventureWorks2012;
GO
DECLARE @MyTableVar table (
    ProductID int NOT NULL, 
    ProductName nvarchar(50)NOT NULL,
    ProductModelID int NOT NULL, 
    PhotoID int NOT NULL);

DELETE Production.ProductProductPhoto
OUTPUT DELETED.ProductID,
       p.Name,
       p.ProductModelID,
       DELETED.ProductPhotoID
    INTO @MyTableVar
OUTPUT DELETED.ProductID, DELETED.ProductPhotoID, GETDATE() AS DeletedDate 
FROM Production.ProductProductPhoto AS ph
JOIN Production.Product as p 
    ON ph.ProductID = p.ProductID 
WHERE p.ProductID BETWEEN 800 and 810;

--Display the results of the table variable.
SELECT ProductID, ProductName, PhotoID, ProductModelID 
FROM @MyTableVar;
GO

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

Aşağıdaki örnek, döndürülen verileri yakalar OUTPUTyan tümcesi bir MERGEdeyimi ve bu verileri başka bir tabloya ekler. MERGEDeyimi güncelleştirmeleri Quantitysütununda ProductInventoryişlenir siparişleri temel alınarak günlük, Masa SalesOrderDetailtablosu. Ayrıca ürünleri olan stokların düşmesi için satırları siler 0ya da aşağıda. Ö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

Sil (Transact-sql)

Insert (Transact-sql)

Güncelleştirme (Transact-sql)

Tablo (Transact-sql)

CREATE TRIGGER (Transact-SQL)

sp_configure (Transact-sql)