Aracılığıyla paylaş


OUTPUT yan tümcesi (Transact-SQL)

Şunlar için geçerlidir:SQL ServerAzure SQL VeritabanıAzure SQL Yönetilen ÖrneğiMicrosoft Fabric'te SQL veritabanı

bir , INSERTUPDATEDELETE , veya deyiminden etkilenen MERGEher satırdan veya ifadelerden bilgi döndürür. Bu sonuçlar, onay iletileri, arşivleme ve diğer uygulama gereksinimleri gibi durumlarda kullanılmak üzere işleme uygulamasına döndürülebilir. Sonuçlar bir tablo veya tablo değişkenine de eklenebilir. Buna ek olarak, iç içe OUTPUT, , INSERTUPDATEveya DELETE deyimindeki bir MERGE yan tümcenin sonuçlarını yakalayabilir ve bu sonuçları bir hedef tabloya veya görünüme ekleyebilirsiniz.

Note

Yan UPDATEtümcesi olan bir INSERT , DELETEveya OUTPUT deyimi, deyim hatalarla karşılaşsa ve geri döndürülse bile istemciye satır döndürür. deyimini çalıştırdığınızda herhangi bir hata oluşursa sonuç kullanılmamalıdır.

Kullanıldığı alanlar:

Transact-SQL söz dizimi kuralları

Syntax

<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

Arguments

@table_variable

Döndürülen satırların çağırana döndürülmek yerine içine eklendiği bir tablo değişkeni belirtir. @table_variable , , INSERTUPDATEveya DELETE deyiminden MERGEönce bildirilmelidir.

column_list belirtilmezse, tablo değişkeninin sonuç kümesiyle aynı sayıda sütuna OUTPUT sahip olması gerekir. Özel durumlar, atlanması gereken kimlik ve hesaplanan sütunlardır. column_list belirtilirse, atlanmış sütunların null değerlere izin vermesi veya bunlara varsayılan değerler atanmış olması gerekir.

Tablo değişkenleri hakkında daha fazla bilgi için bkz. tablo.

output_table

Çağırana döndürülmek yerine döndürülen satırların eklendiği bir tablo belirtir. output_table geçici bir tablo olabilir.

column_list belirtilmezse, tablo sonuç kümesiyle aynı sayıda sütuna OUTPUT sahip olmalıdır. Özel durumlar, atlanması gereken kimlik ve hesaplanan sütunlardır. column_list belirtilirse, atlanmış sütunların null değerlere izin vermesi veya bunlara varsayılan değerler atanmış olması gerekir.

output_table yapamam:

  • Üzerinde tanımlanan tetikleyicileri etkinleştirdiniz.
  • Kısıtlamanın FOREIGN KEY iki tarafına da katılın.
  • Kısıtlamalarınız veya etkinleştirilmiş kurallarınız vardır CHECK .

column_list

Yan tümcesinin hedef tablosundaki sütun adlarının INTO isteğe bağlı listesi. INSERT deyiminde izin verilen sütun listesine benzer.

scalar_expression

Tek bir değere göre değerlendirilen simgelerin ve işleçlerin birleşimi. scalar_expression toplama işlevlerine izin verilmez.

Değiştirilmekte olan tablodaki sütunlara yapılan tüm başvurular veya INSERTED ön eki ile nitelenmelidirDELETED.

column_alias_identifier

Sütun adına başvurmak için kullanılan alternatif ad.

DELETED

Güncelleştirme veya silme işlemi tarafından silinen değeri ve geçerli işlemle değişmeyen mevcut değerleri belirten bir sütun ön eki. ön eki eklenmiş DELETED sütunlar, , UPDATEveya DELETE deyimi tamamlanmadan önceki MERGEdeğeri yansıtır.

DELETED deyimindeki OUTPUTINSERT yan tümcesiyle kullanılamaz.

EKLENEN

Ekleme veya güncelleştirme işlemi tarafından eklenen değeri ve geçerli işlemle değişmeyen mevcut değerleri belirten bir sütun ön eki. ön ekli INSERTED sütunlar, , UPDATEveya INSERT deyimi tamamlandıktan sonra MERGEancak tetikleyiciler yürütülmeden önceki değeri yansıtır.

INSERTED deyimindeki OUTPUTDELETE yan tümcesiyle kullanılamaz.

from_table_name

Güncelleştirilecek veya silinecek satırları belirtmek için kullanılan , FROMveya DELETE deyiminin yan tümcesine dahil UPDATE edilen tabloyu belirten bir MERGEsütun ön eki.

Değiştirilen tablo yan tümcesinde FROM de belirtilirse, bu tablodaki sütunlara yapılan tüm başvurular veya INSERTED ön eki ile nitelenmelidirDELETED.

*

Yıldız işareti (*), silme, ekleme veya güncelleştirme eyleminden etkilenen tüm sütunların tabloda bulundukları sırada döndürüldüğünü belirtir.

Örneğin, OUTPUT DELETED.* aşağıdaki DELETE deyimde tablodan ShoppingCartItem silinen tüm sütunları döndürür:

DELETE Sales.ShoppingCartItem
    OUTPUT DELETED.*;

column_name

Açık bir sütun başvurusu. Değiştirilmekte olan tabloya yapılan tüm başvurular, veya INSERTED ön eki tarafından DELETED uygun şekilde nitelenmelidir, örneğin: INSERTED.<column_name>.

$action

Yalnızca deyimi için MERGE kullanılabilir. Her satır için üç değerden birini döndüren bir deyimdeki yan tümcesinde OUTPUT türünde bir MERGE sütun belirtir: INSERT, UPDATE, veya DELETE, bu satırda gerçekleştirilen eyleme göre.

Remarks

Yan OUTPUT <dml_select_list> tümcesi OUTPUT <dml_select_list> INTO { @table_variable | output_table } ve yan tümcesi tek INSERTbir , UPDATE, DELETEveya MERGE deyiminde tanımlanabilir.

Note

Aksi belirtilmedikçe, yan tümcesine OUTPUT başvurular hem yan tümcesine OUTPUT hem de yan tümcesine başvurur OUTPUT INTO .

OUTPUT yan tümcesi, bir INSERT veya UPDATE işleminden sonra kimlik veya hesaplanan sütunların değerini almak için yararlı olabilir.

öğesine hesaplanan sütun eklendiğinde <dml_select_list>, çıkış tablosundaki veya tablo değişkenindeki karşılık gelen sütun hesaplanan sütun değildir. Yeni sütundaki değerler, deyimi yürütülürken hesaplanan değerlerdir.

Değişikliklerin tabloya uygulanma sırası ve satırların çıkış tablosuna veya tablo değişkenine eklenme sırası karşılık gelmez.

Parametreler veya değişkenler bir UPDATE deyimin parçası olarak değiştirilirse, OUTPUT yan tümcesi her zaman değiştirilen değer yerine deyimi yürütülmeden önceki parametre veya değişkenin değerini döndürür.

söz dizimi kullanan OUTPUT bir UPDATE imleç üzerine yerleştirilmiş bir veya DELETE deyimiyle kullanabilirsinizWHERE CURRENT OF.

OUTPUT yan tümcesi aşağıdaki deyimlerde desteklenmez:

  • Yerel bölümlenmiş görünümlere, dağıtılmış bölümlenmiş görünümlere veya uzak tablolara başvuran DML deyimleri.

  • INSERT deyimi içeren EXECUTE deyimler.

  • Veritabanı uyumluluk düzeyi 100 olarak ayarlandığında yan tümcesinde OUTPUT tam metin koşullarına izin verilmez.

  • Yan OUTPUT INTO tümcesi bir görünüme veya satır kümesi işlevine eklemek için kullanılamaz.

  • Hedef olarak tablo içeren bir OUTPUT INTO yan tümce içeriyorsa kullanıcı tanımlı işlev oluşturulamaz.

Belirsiz davranışı önlemek için yan OUTPUT tümcesi aşağıdaki başvuruları içeremez:

  • Kullanıcı veya sistem veri erişimi gerçekleştiren ya da bu erişimi gerçekleştirdiğini varsayan alt sorgular veya kullanıcı tanımlı işlevler. Kullanıcı tanımlı işlevlerin şemaya bağlı değilse veri erişimi gerçekleştirdikleri varsayılır.

  • Bu sütun aşağıdaki yöntemlerden biri tarafından tanımlandığında görünümden veya satır içi tablo değerli işlevden bir sütun:

    • Bir alt sorgu.

    • Kullanıcı veya sistem veri erişimi gerçekleştiren veya bu tür bir erişim gerçekleştirdiğini varsayılan kullanıcı tanımlı bir işlev.

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

    SQL Server yan tümcesinde OUTPUT böyle bir sütun algıladığında 4186 hatası oluşur.

OUTPUT yan tümcesinden döndürülen verileri tabloya ekleme

İç içe OUTPUT, , INSERTUPDATEveya DELETE deyimindeki bir MERGE yan tümcenin sonuçlarını yakalarken ve bu sonuçları bir hedef tabloya eklerken aşağıdaki bilgileri aklınızda bulundurun:

  • Tüm işlem atomiktir. Yan tümcesini INSERT içeren OUTPUT hem deyimi hem de iç içe DML deyimi yürütülür veya deyimin tamamı başarısız olur.

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

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

    • Hedefe kısıtlama FOREIGN KEY uygulanamaz veya bir FOREIGN KEY kısıtlama tarafından başvurulamıyor.

    • Tetikleyiciler hedefte tanımlanamaz.

    • Hedef, işlem çoğaltması için birleştirme çoğaltma veya güncelleştirilebilir aboneliklere katılamaz.

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

    • Hedef uzak tablo veya bölümlenmiş görünüm olamaz.

    • Kaynağın kendisi bir <dml_table_source> yan tümce içeremez.

  • OUTPUT INTO yan tümcesi, yan INSERT tümce içeren deyimlerde <dml_table_source> desteklenmez.

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

  • @@IDENTITY, SCOPE_IDENTITYve IDENT_CURRENT yalnızca iç içe DML deyimi tarafından oluşturulan kimlik değerlerini döndürür; dış INSERT deyim tarafından oluşturulan değerleri döndürmez.

  • Sorgu bildirimleri deyimini tek bir varlık olarak kabul eder ve oluşturulan herhangi bir iletinin türü, önemli değişiklik dış INSERT deyimin kendisinden olsa bile iç içe DML'nin türüdür.

  • <dml_table_source> yan tümcesinde SELECT ve WHERE yan tümceleri alt sorguları, toplama işlevlerini, derecelendirme işlevlerini, tam metin koşullarını, veri erişimi gerçekleştiren kullanıcı tanımlı işlevleri veya TEXTPTR() işlevi içeremez.

Parallelism

OUTPUT sonuçları istemciye veya tablo değişkenine döndüren yan tümce her zaman bir seri plan kullanır.

Uyumluluk düzeyi 130 veya üzeri olarak ayarlanmış bir veritabanı bağlamında, bir INSERT...SELECT işlem deyimi için WITH (TABLOCK) bir SELECT ipucu kullanırsa ve ayrıca geçici veya kullanıcı tablosuna eklemek için OUTPUT...INTO kullanırsaINSERT...SELECT, alt ağaç maliyetine bağlı olarak hedef tablo paralellik için uygundur. Yan tümcesinde başvuruda bulunan OUTPUT INTO hedef tablo paralellik için uygun değildir.

Triggers

'den OUTPUT döndürülen sütunlar, , INSERTveya UPDATE deyimi tamamlandıktan sonra DELETEancak tetikleyiciler yürütülmeden önce verileri yansıtır.

Tetikleyiciler içinINSTEAD OF, tetikleyici işleminin sonucu olarak hiçbir değişiklik yapılmasa bile, döndürülen sonuçlar , INSERTveya UPDATE gerçekten gerçekleşmiş gibi DELETEoluşturulur. Yan tümcesi içeren bir OUTPUT deyim tetikleyicinin gövdesinde kullanılıyorsa, ile ilişkilendirilmiş INSERTEDve DELETED tablolarıyla OUTPUT sütun başvurularının çoğaltılmasını önlemek için eklenen ve silinen tablolara başvurmak için tablo diğer adları kullanılmalıdır.

OUTPUT Yan tümcesi anahtar sözcüğü de belirtilmeden INTO belirtilirse, DML işleminin hedefi üzerinde belirtilen DML eylemi için tanımlanmış hiçbir etkin tetikleyiciye sahip olamaz. Örneğin, yan tümcesi bir OUTPUT deyimde tanımlanmışsaUPDATE, hedef tabloda etkin UPDATE tetikleyiciler olamaz.

sp_configure Tetikleyicilerden gelen sonuçlara izin verme seçeneği ayarlanırsa, yan tümcesi olmayan bir OUTPUTINTO yan tümcesi tetikleyici içinden çağrıldığında deyimin başarısız olmasına neden olur.

Veri türleri

yan tümcesi OUTPUT büyük nesne veri türlerini destekler: nvarchar(max), varchar(max), varbinary(max), text, ntext, image ve xml. .WRITEveya UPDATE sütununu değiştirmek için deyimindeki yan tümcesini kullandığınızda, değerlere başvurulduğunda önceki ve sonraki görüntülerin tamamı döndürülür. İşlev yan TEXTPTR() tümcesindeki metin, ntext veya görüntü sütunundaki bir ifadenin OUTPUT parçası olarak görünemez.

Queues

Tabloları kuyruk olarak kullanan uygulamalarda veya ara sonuç kümelerini tutmak için kullanabilirsiniz OUTPUT . Diğer bir ifadeyle, uygulama sürekli olarak tabloya satır ekliyor veya tablodan satır kaldırıyor. Aşağıdaki örnek, silinen satırı çağıran uygulamaya döndürmek için deyimindeki OUTPUT yan tümcesini kullanırDELETE.

USE AdventureWorks2022;
GO

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

Bu örnek, kuyruk olarak kullanılan tablodan bir satırı kaldırır ve silinen değerleri tek bir eylemde işleme uygulamasına döndürür. Yığın uygulamak için tablo kullanma gibi başka semantikler de uygulanabilir. Ancak SQL Server, yan tümcesi kullanılarak OUTPUT DML deyimleri tarafından satırların işlenme ve döndürülmesi sırasını garanti etmez. İstenen semantiği garanti eden veya DML işlemi için birden çok satır uygun olduğunda, garantili bir sıra olmadığını anlayabilecek uygun WHERE bir yan tümce eklemek uygulamaya bağlı. Aşağıdaki örnek bir alt sorgu kullanır ve istenen sıralama semantiğini uygulamak için benzersizliğin sütunun bir özelliği DatabaseLogID olduğunu varsayar.

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;

Sonuçlar şunlardır:

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

Note

READPAST Senaryonuz birden çok uygulamanın bir tablodan yıkıcı bir okuma gerçekleştirmesine izin veriyorsa ve deyimlerinde tablo ipucunu UPDATEDELETE kullanın. Bu, başka bir uygulama zaten tablodaki ilk uygun kaydı okuyorsa karşılaşabilecek kilit sorunlarını önler.

Permissions

SELECT izinleri aracılığıyla <dml_select_list> alınan veya içinde kullanılan tüm sütunlarda <scalar_expression>gereklidir.

INSERT izinleri içinde belirtilen tüm tablolarda <output_table>gereklidir.

Examples

Bu makaledeki kod örnekleri, AdventureWorks2025 giriş sayfasından indirebileceğiniz AdventureWorksDW2025 veya örnek veritabanını kullanır.

A. OUTPUT INTO'yi INSERT deyimiyle kullanma

Aşağıdaki örnek tabloya ScrapReason bir satır ekler ve deyiminin OUTPUT sonuçlarını tablo değişkenine döndürmek için yan tümcesini @MyTableVar kullanır. ScrapReasonID Sütun bir IDENTITY özelliğiyle tanımlandığından, bu sütunun INSERT deyiminde bir değer belirtilmez. Ancak, bu sütun için Veritabanı Altyapısı tarafından oluşturulan değer sütunundaki OUTPUT yan tümcesinde INSERTED.ScrapReasonIDdöndürülür.

USE AdventureWorks2022;
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. DELETE deyimiyle OUTPUT kullanma

Aşağıdaki örnek tablodaki ShoppingCartItem tüm satırları siler. yan tümcesi OUTPUT DELETED.* , deyiminin DELETE sonuçlarının, yani silinen satırlardaki tüm sütunların çağıran uygulamaya döndürüldüğünü belirtir. Aşağıdaki SELECT deyim, tablodaki ShoppingCartItem silme işleminin sonuçlarını doğrular.

USE AdventureWorks2022;
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'yi UPDATE deyimiyle kullanma

Aşağıdaki örnek, tablodaki VacationHoursEmployee sütunu ilk 10 satır için yüzde 25 güncelleştirir. OUTPUT yan tümcesi, sütununda deyimini VacationHours uygulamadan önce var olan değeri ve sütundaki UPDATEDELETED.VacationHoursgüncelleştirilmiş değeri tablo değişkenine INSERTED.VacationHours döndürür@MyTableVar.

aşağıdaki iki SELECT deyim, içindeki değerleri @MyTableVar ve tablodaki güncelleştirme işleminin Employee sonuçlarını döndürür.

USE AdventureWorks2022;
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. İfade döndürmek için OUTPUT INTO kullanma

Aşağıdaki örnek, yan tümcesindeki bir ifadeyi OUTPUT güncelleştirilmiş VacationHours değerle VacationHours güncelleştirme uygulanmadan önceki değer arasındaki fark olarak tanımlayarak C örneğini oluşturur. Bu ifadenin değeri sütunundaki @MyTableVarVacationHoursDifferencetablo değişkenine döndürülür.

USE AdventureWorks2022;
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'yi UPDATE deyimindeki from_table_name ile kullanma

Aşağıdaki örnek, belirtilen ve ScrapReasonIDile tüm iş siparişleri için tablodaki WorkOrder sütunu güncelleştirirProductID.ScrapReasonID yan tümcesi OUTPUT INTO , güncelleştirilmekte olan tablodan (WorkOrder) ve ayrıca tablodan Product değerleri döndürür. Tablo Product , güncelleştirilecek satırları belirtmek için yan tümcesinde FROM kullanılır. WorkOrder Tablonun üzerinde tanımlanmış bir AFTER UPDATE tetikleyici olduğundan anahtar INTO sözcüğü gereklidir.

USE AdventureWorks2022;
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. DELETE deyiminde from_table_name ile OUTPUT INTO kullanma

Aşağıdaki örnek, deyimi yan ProductProductPhoto tümcesinde FROM tanımlanan arama ölçütlerine göre tablodaki DELETE satırları siler. yan tümcesi OUTPUT , silinen tablodaki (DELETED.ProductID, DELETED.ProductPhotoID) sütunları ve tablodan Product sütunları döndürür. Bu tablo, silinecek satırları belirtmek için yan tümcesinde FROM kullanılır.

USE AdventureWorks2022;
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'yi büyük bir nesne veri türüyle kullanma

Aşağıdaki örnek, yan tümcesini kullanarak tablodaki DocumentSummaryProduction.Document sütunundaki .WRITE kısmi değeri güncelleştirir. components features Sözcük, değiştirilen sözcük, var olan verilerde değiştirilecek sözcüğün başlangıç konumu (uzaklık) ve değiştirilecek karakter sayısı (uzunluk) belirtilerek sözcükle değiştirilir. Örnek, sütunun OUTPUT önceki ve sonraki görüntülerini DocumentSummary tablo değişkenine döndürmek için yan tümcesini @MyTableVar kullanır. Sütunun önceki ve sonraki görüntülerinin DocumentSummary tamamı döndürülür.

USE AdventureWorks2022;
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. OUTPUT'i BIR YERİNE tetikleyicide kullanma

Aşağıdaki örnek, tetikleyici işleminin OUTPUT sonuçlarını döndürmek için tetikleyicideki yan tümcesini kullanır. İlk olarak, tabloda bir görünüm oluşturulur ScrapReason ve ardından görünümde yalnızca INSTEAD OF INSERT temel tablonun sütununun kullanıcı tarafından değiştirilmesini sağlayan bir Name tetikleyici tanımlanır. Sütun ScrapReasonID temel tablodaki bir IDENTITY sütun olduğundan, tetikleyici kullanıcı tarafından sağlanan değeri yoksayar. Bu, Veritabanı Altyapısı'nın otomatik olarak doğru değeri oluşturmasına olanak tanır. Ayrıca, kullanıcı ModifiedDate tarafından sağlanan değer yoksayılır ve geçerli tarihe ayarlanır. OUTPUT yan tümcesi, tabloya ScrapReason eklenen değerleri döndürür.

USE AdventureWorks2022;
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 ('2004-04-12') tarihinde oluşturulan sonuç kümesi aşağıdadır. ve ScrapReasonIDActual sütunları, ModifiedDate deyiminde sağlanan INSERT değerler yerine tetikleyici işlemi tarafından oluşturulan değerleri yansıtır.

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

I. OUTPUT INTO'yi kimlik ve hesaplanan sütunlarla kullanma

Aşağıdaki örnek, tabloyu oluşturur EmployeeSales ve ardından kaynak tablolardan veri almak için deyimi INSERT olan bir SELECT deyimi kullanarak içine birkaç satır ekler. Tabloda EmployeeSales bir kimlik sütunu (EmployeeID) ve hesaplanan sütun (ProjectedSales) bulunur.

USE AdventureWorks2022;
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 (
    EmployeeID INT NOT NULL,
    LastName NVARCHAR(20) NOT NULL,
    FirstName NVARCHAR(20) NOT NULL,
    CurrentSales MONEY NOT NULL,
    ProjectedSales MONEY NOT NULL
);

INSERT INTO dbo.EmployeeSales (
    LastName,
    FirstName,
    CurrentSales
)
OUTPUT INSERTED.EmployeeID,
    INSERTED.LastName,
    INSERTED.FirstName,
    INSERTED.CurrentSales,
    INSERTED.ProjectedSales
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 EmployeeID,
    LastName,
    FirstName,
    CurrentSales,
    ProjectedSales
FROM @MyTableVar;
GO

SELECT EmployeeID,
    LastName,
    FirstName,
    CurrentSales,
    ProjectedSales
FROM dbo.EmployeeSales;
GO

J. Output ve OUTPUT INTO'yi tek bir deyimde kullanma

Aşağıdaki örnek, deyimi yan ProductProductPhoto tümcesinde FROM tanımlanan arama ölçütlerine göre tablodaki DELETE satırları siler. yan tümcesi OUTPUT INTO , silinen tablodan (DELETED.ProductID, DELETED.ProductPhotoID) sütunlarını ve tablodan Product tablo değişkenine @MyTableVar sütunları döndürür. Tablo Product , silinecek satırları belirtmek için yan tümcesinde FROM kullanılır. OUTPUT yan tümcesi , DELETED.ProductID sütunlarını ve satırın tablodan DELETED.ProductPhotoID silindiği tarih ve saati çağıran uygulamaya döndürürProductProductPhoto.

USE AdventureWorks2022;
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
INNER 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. OUTPUT yan tümcesinden döndürülen verileri ekleme

Aşağıdaki örnek, bir deyiminin OUTPUT yan tümcesinden döndürülen verileri yakalar ve bu verileri başka bir MERGE tabloya ekler. deyimi, MERGE tabloda işlenen siparişlere göre tablonun sütununu QuantityProductInventory günlük olarak güncelleştirirSalesOrderDetail. Ayrıca envanterleri daha az veya daha az 0 olan ürünlerin satırlarını da siler. Örnek, silinen satırları yakalar ve stok içermeyen ürünleri izleyen başka bir tabloya ZeroInventoryekler.

USE AdventureWorks2022;
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
        INNER 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;
GO