Aracılığıyla paylaş


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

INSERT, update veya bir kaynak tabloyla birleştirme sonuçlarını temel hedef tablo silme işlemlerini gerçekleştirir. Örneğin, iki tablo ekleme, güncelleştirme ya da diğer tabloda bulunan farklılıklar temel alan bir tablodaki satırların silinmesi eşitleyebilirsiniz.

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

Sözdizimi

[ WITH <common_table_expression> [,...n] ]
MERGE 
    [ TOP ( expression ) [ PERCENT ] ] 
    [ INTO ] <target_table> [ WITH ( <merge_hint> ) ] [ [ AS ] table_alias ]
    USING <table_source> 
    ON <merge_search_condition>
    [ WHEN MATCHED [ AND <clause_search_condition> ]
        THEN <merge_matched> ] [ ...n ]
    [ WHEN NOT MATCHED [ BY TARGET ] [ AND <clause_search_condition> ]
        THEN <merge_not_matched> ]
    [ WHEN NOT MATCHED BY SOURCE [ AND <clause_search_condition> ]
        THEN <merge_matched> ] [ ...n ]
    [ <output_clause> ]
    [ OPTION ( <query_hint> [ ,...n ] ) ]    
;

<target_table> ::=
{ 
    [ database_name . schema_name . | schema_name . ]
  target_table
}

<merge_hint>::=
{
    { [ <table_hint_limited> [ ,...n ] ]
    [ [ , ] INDEX ( index_val [ ,...n ] ) ] }
}

<table_source> ::= 
{
    table_or_view_name [ [ AS ] table_alias ] [ <tablesample_clause> ] 
        [ WITH ( table_hint [ [ , ]...n ] ) ] 
  | rowset_function [ [ AS ] table_alias ] 
        [ ( bulk_column_alias [ ,...n ] ) ] 
  | user_defined_function [ [ AS ] table_alias ]
  | OPENXML <openxml_clause> 
  | derived_table [ AS ] table_alias [ ( column_alias [ ,...n ] ) ] 
  | <joined_table> 
  | <pivoted_table> 
  | <unpivoted_table> 
}

<merge_search_condition> ::=
    <search_condition>

<merge_matched>::=
    { UPDATE SET <set_clause> | DELETE }

<set_clause>::=
SET
  { column_name = { expression | DEFAULT | NULL }
  | { udt_column_name.{ { property_name = expression
                        | field_name = expression }
                        | method_name ( argument [ ,...n ] ) }
    }
  | column_name { .WRITE ( expression , @Offset , @Length ) }
  | @variable = expression
  | @variable = column = expression
  | column_name { += | -= | *= | /= | %= | &= | ^= | |= } expression
  | @variable { += | -= | *= | /= | %= | &= | ^= | |= } expression
  | @variable = column { += | -= | *= | /= | %= | &= | ^= | |= } expression
  } [ ,...n ] 

<merge_not_matched>::=
{
    INSERT [ ( column_list ) ] 
        { VALUES ( values_list )
        | DEFAULT VALUES }
}

<clause_search_condition> ::=
    <search_condition>

<search condition> ::=
    { [ NOT ] <predicate> | ( <search_condition> ) } 
    [ { AND | OR } [ NOT ] { <predicate> | ( <search_condition> ) } ] 
[ ,...n ] 

<predicate> ::= 
    { expression { = | < > | ! = | > | > = | ! > | < | < = | ! < } expression 
    | string_expression [ NOT ] LIKE string_expression 
  [ ESCAPE 'escape_character' ] 
    | expression [ NOT ] BETWEEN expression AND expression 
    | expression IS [ NOT ] NULL 
    | CONTAINS 
  ( { column | * } , '< contains_search_condition >' ) 
    | FREETEXT ( { column | * } , 'freetext_string' ) 
    | expression [ NOT ] IN ( subquery | expression [ ,...n ] ) 
    | expression { = | < > | ! = | > | > = | ! > | < | < = | ! < } 
  { ALL | SOME | ANY} ( subquery ) 
    | EXISTS ( subquery ) } 

<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

  • İLE <common_table_expression>
    Geçici adlı sonuç kümesi veya BIRLEŞTIRME deyimini kapsamı içinde tanımlanan görünüm, olarak da bilinen ortak tablo ifade belirtir. Sonuç kümesi, basit bir sorgudan elde edilen ve BIRLEŞTIRME deyimini tarafından başvurulmaktadır. Daha fazla bilgi için, bkz. Common_table_expression (Transact-sql).

  • ÜST ( expression) [percent]
    Numarasını veya etkilenen satırların yüzdesini belirtir. expressionbir sayı veya satırları yüzdesi olabilir. İLK ifadesinde başvurulan satır değil herhangi bir sırayla düzenlenir. Daha fazla bilgi için, bkz. TOP (Transact-sql).

    top yan tümcesi, tüm kaynak tablo ve tüm hedef tablo katıldı ve bir INSERT, update veya delete eylem için geçerli olmayan birleştirilmiş satırlar kaldırılır sonra uygulanır. Daha top yan tümcesi belirtilen değere birleştirilen satır sayısını azaltır ve INSERT, update veya delete eylemleri kalan birleştirilen satır Rakamsız bir şekilde uygulanır. Yani, orada hiçbir sipariş satırları olduğunda yan tümceleri içinde tanımlanan eylemler arasında dağıtılır. Örneğin, üst (10) belirterek, 10 satır etkiler; Bu satır, 7 güncelleştirilebilir ve 3 eklenmiş, veya 1 silinebilir, 5 Güncellenme ve 4 vb. eklenmiş.

    BIRLEŞTIRME deyimini hem kaynak hem de hedef tabloları tam tablo tarama gerçekleştirdiğinden, top yan tümcesi birden çok toplu işlemi oluşturarak büyük bir tabloyu değiştirmek için kullanıldığında g/Ç performansı etkilenebilir. Bu senaryoda, tüm ardışık toplu yeni satırlar hedef sağlamak önemlidir.

  • database_name
    Hangi veritabanı adı target_tablebulunur.

  • schema_name
    Hangi şema adı target_tableait.

  • target_table
    Tablo ya da görünümü karşı veri satırlarına <table_source> göre eşleştirilir <clause_search_condition>. target_tableherhangi bir ekleme, güncelleştirme veya silme işlemleri BIRLEŞTIRME deyimini olduğunda yan tümceleri tarafından belirtilen hedeftir.

    Eğer target_tablebir görünümü, buna karşı herhangi bir eylem görünümlerini güncelleştirme için koşulları karşılaması gerekir. Daha fazla bilgi için, bkz. Bir görünüm üzerinden veri değiştirme.

    target_tablebir uzak tablo olamaz. target_tablekuralların üzerinde tanımlı değildir.

  • [OLARAK]table_alias
    Bir diğer ad, bir tablo başvurmak için kullanılır.

  • KULLANARAK <table_source>
    Veri kaynağı eşleşen veri satırları belirtir target_tablegöre <merge_search durum>. Bu maçın sonucu, BIRLEŞTIRME deyimini olduğunda yan tümceleri tarafından gerçekleştirilecek eylemleri belirler. <table_source> bir uzak tablo veya uzak tablolara erişir türetilmiş bir tablo olabilir.

    <table_source> kullanır türetilmiş bir tablo olabilir Transact-SQL   Tablo değeri Oluşturucu birden çok satır belirterek bir tablo oluşturmak için.

    Sözdizimi ve bu maddenin bağımsız değişkenleri hakkında daha fazla bilgi için bkz: FROM (Transact-sql).

  • on <merge_search_condition>
    Koşulları belirten <table_source> ile katılan target_tableonlar eşleştiği belirlemek için.

    Dikkat notuDikkat

    Amaçları eşleştirmek için kullanılan yalnızca hedef tablo sütunlarından belirtmek önemlidir. Başka bir deyişle, kaynak tablonun karşılık gelen sütun için karşılaştırılan hedef tablo sütunları belirtin. Yapmak değil kalkışmak-e on yan tümcesi hedef tablodaki satırlar gibi belirterek filtre tarafından sorgu performansını artırmak AND NOT target_table.column_x = value. Böylece beklenmedik ve hatalı sonuçlar döndürebilir.

  • SONRA eşleşen zaman <merge_matched>
    Belirleyen tüm satırlar target_tabletarafından döndürülen satırların eşleşen <table_source > on <merge_search_condition>ve herhangi bir ek arama koşulu karşılayan, ya güncelleştirildi veya silindi göre <merge_matched > yan.

    BIRLEŞTIRME deyimini en çok iki eşleşen zaman olabilir yan tümceleri. Eğer iki yan tümcelerini belirtilen, o ilk yan tümce bir ve tarafından eşlik olmalıdır <search_condition> tümcesi. Belirli bir satır için ikinci ilk değilse matched yan tümcesi yalnızca UYGULANDIĞINDA. Eğer iki eşleşen zaman yan tümceleri, sonra bir güncelleştirme eylem belirtmeniz gerekir ve bir silme eylemi belirtmeniz gerekir. Güncelleştirme belirtilmişse <merge_matched> yan tümcesi ve birden fazla satır <table_source>eşleşen bir satır target_tablegöre <merge_search_condition>, SQL Serverhata veriyor. BIRLEŞTIRME deyimini aynı satır birden fazla kez güncelleştirmeniz veya güncelleştirme ve aynı satırı silin.

  • [Hedef] ardından eşleşen zaman <merge_not_matched>
    Bir satır eklenen belirtir target_table tarafından döndürülen her satır için <table_source > on <merge_search_condition > bir satırda eşleşmiyor target_table, ama bir ek bir arama koşulu varsa tatmin etmez. Eklemek için değeri tarafından belirtilen <merge_not_matched> tümcesi. BIRLEŞTIRME deyimini-ebilmek-si olmak sadece bir not matched yan tümcesi olduğunda.

  • not kaynak tarafından eşleşen zaman sonra <merge_matched>
    Belirleyen tüm satırlar target_tabletarafından döndürülen satırların uymayan <table_source > on <merge_search_condition>, ve bu, herhangi bir ek arama koşulu karşılayan ya güncelleştirildi veya silindi göre <merge_matched > yan.

    BIRLEŞTIRME deyimini en çok iki olduğunda not eşleşen kaynak by yan tümceleri olabilir. Eğer iki yan tümcelerini belirtilen, o ilk yan tümce bir ve tarafından eşlik olmalıdır <clause_search_condition> tümcesi. İçin herhangi bir belirli satır, ikinci when by eşleşen kaynak yan tümcesi yalnızca uygulandığı ilk değil. Eğer iki olduğunda not eşleşen kaynak by yan tümceleri, sonra bir güncelleştirme eylem belirtmeniz gerekir ve bir silme eylemi belirtmeniz gerekir. Hedef tablodaki sütunlar içinde başvurulabilir <clause_search_condition>.

    Ne zaman hiçbir satır iade tarafından <table_source>, kaynak tablosundaki sütunlara erişilemiyor. Update veya delete eylem belirtilen <merge_matched> yan tümcesi başvuruları kaynak tablodaki sütunların, hata 207 (Geçersiz sütun adı) döndürülür. Örneğin, yan WHEN NOT MATCHED BY SOURCE THEN UPDATE SET TargetTable.Col1 = SourceTable.Col1deyimi başarısız olmasına neden Col1kaynak tablo erişilememektedir.

  • VE <clause_search_condition>
    Herhangi bir geçerli arama koşulu belirtir. Daha fazla bilgi için, bkz. Arama koşulu (Transact-sql).

  • <Table_Hint_Limited>
    Hedef Tablo INSERT, update veya delete eylemleri birleştirme deyimi tarafından gerçekleştirilen her uygulanan bir veya daha fazla tablo ipuçları belirtir. WITH anahtar sözcük ve ayraçlar gereklidir.

    nolock ve READUNCOMMITTED izin verilmez. Tablo ipuçları hakkında daha fazla bilgi için bkz: Tablo ipuçları (Transact-sql).

    INSERT deyimi hedef bir tablo tablock ipucu belirtme tablockx ipucu belirtme aynı etkiye sahiptir. Özel kilit masaya alınır. forceseek belirtildiğinde katıldı kaynak tablo ile hedef tablo örtülü örneğine uygulanır.

    Dikkat notuDikkat

    INSERT UNIQUE kısıtlamaları ihlal INSERT işlemlerinde sonuçlanabilir then [hedef] eşleşen zaman readpast ile belirtme.

  • INDEX ( index_val ,...n ] )
    Hedef tablonun kaynak tablo ile örtülü bir birleşim gerçekleştirmek için bir veya daha fazla dizin Kımlığı veya adı belirtir. Daha fazla bilgi için, bkz. Tablo ipuçları (Transact-sql).

  • <output_clause>
    Her satır için bir satır döndürür target_table, updated, eklenmiş veya silinmiş, özel bir sırada. Bu maddenin bağımsız değişkenleri hakkında daha fazla bilgi için bkz: output Yantümcesi (Transact-sql).

  • OPTION ( <query_hint> [ ,...n ] )
    Doktoru ipuçları veritabanı altyapısı deyimi biçimini özelleştirmek için kullanıldığını belirtir. Daha fazla bilgi için, bkz. Sorgu ipuçları (Transact-sql).

  • <merge_matched>
    Tüm satırlar için uygulanan eylem silme veya güncelleştirme belirtir target_tabletarafından döndürülen satırların uymayan <table_source > on <merge_search_condition>, ve herhangi bir ek arama koşulu karşılayan.

    • update set <set_clause>
      Sütun veya hedef tablo ve değerleri ile bunları güncelleştirmek için güncelleştirilmesi için değişken adları listesini belirtir.

      Bu maddenin bağımsız değişkenleri hakkında daha fazla bilgi için bkz: Güncelleştirme (Transact-sql). Değişken bir sütun ile aynı değere ayarlamak izin verilmez.

    • DELETE
      Satırların eşleşen satırları belirtir target_tablesilinir.

  • <merge_not_matched>
    Hedef tabloya eklemek için değerleri belirtir.

    • (column_list)
      Bir veya daha fazla sütun veri eklemek hangi hedef tablo listesidir. Sütunları tek parça ad belirtilmeli veya başka BIRLEŞTIRME deyimi başarısız olur. column_listparantez içinde ve virgülle ayrılmış olması gerekir.

    • VALUES ( values_list)
      Virgülle ayrılmış, sabitler, değişkenler veya dönüş değerleri hedef tabloya eklemek için ifadeleri listesidir. Deyimleri execute deyimi içeremez.

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

    Bu yan tümcesi hakkında daha fazla bilgi için bkz: Insert (Transact-sql).

  • <Arama koşulu>
    Arama koşullarını belirtmek için kullanılan belirtir <merge_search_condition> ya <clause_search_condition>. Bu değişkenleri hakkında daha fazla bilgi için bkz: Arama koşulu (Transact-sql).

Açıklamalar

Üç matched yan tümceleri en az birinin belirtilmesi gerekir, ancak herhangi bir sırada belirtilebilir. Bir değişkeni birden çok kez aynı matched yan tümcesi güncelleştirilemez.

Herhangi bir INSERT, update veya delete eylemleri birleştirme deyim tarafından belirtilen hedef tablo üzerinde tanımlı herhangi bir basamaklı bilgi tutarlılığı kısıtlamaları da dahil olmak üzere tüm kısıtlamaları tarafından sınırlıdır. BİRLEŞTİRME, IGNORE_DUP_KEY, hedef tablodaki herhangi bir benzersiz dizinler için on olarak ayarlanmışsa, bu ayarı yoksayar.

BIRLEŞTIRME deyimi bir noktalı virgül (;) gerektiren bir deyimi Sonlandırıcı olarak. BIRLEŞTIRME deyimi Sonlandırıcı çalıştırdığınızda hata 10713 oluşturulur.

Birleştirme sonra kullanıldığında @@ rowcount (Transact-sql)eklenen, güncelleştirilen ve istemciye silinen satırların toplam sayısını verir.

Birleştirme tamamen ayrılmış bir anahtar sözcük olduğunda, veritabanı uyumluluk düzeyi 100 olarak ayarlanır. BIRLEŞTIRME deyimini 90 ile 100 veritabanı uyumluluk düzeyi altında mevcuttur; ancak veritabanı uyumluluk düzeyi 90 ayarlandığında anahtar sözcüğü tam olarak ayrılmış değil.

Tetikleyici uygulaması

Her ekleme, güncelleştirme veya silme eylemi BIRLEŞTIRME deyiminde belirtilen SQL Serverherhangi bir karşılık-hedef tablo üzerinde tanımlı Tetikleyiciler sonra patlar, ama hangi eylemi ilk veya son tetikleyici ateşlenmesine garantilemez. Aynı eylemi tanımlı Tetikleyiciler belirttiğiniz sırada onur. Tetikleyici atış sırası ayarlama hakkında daha fazla bilgi için bkz: Öncelikle belirtmek ve Tetikleyiciler son.

Hedef Tablo INSERT için tanımlanmış tetikleyici INSTEAD OF etkin olan, güncelleştirmek veya o etkinleştirilmiş bir INSTEAD OF tetikleyici BIRLEŞTIRME deyiminde belirtilen eylemlerin tümünde olmalıdır sonra bir BIRLEŞTIRME deyimi tarafından gerçekleştirilen eylemi silmek.

Eğer orada herhangi bir yerine update ya da delete INSTEAD OF tetikleyici tanımlanmış target_table, güncelleştirme veya silme işlemleri gerçekleştirilemiyor. Bunun yerine, Tetikleyiciler ateşlenmesine ve insertedve deletedtablolar buna göre doldurulur.

Eğer varsa INSTEAD OF INSERT tetikleyici tanımlanmış target_table, INSERT işlemi yapılmaz. Bunun yerine, Tetikleyiciler ateşlenmesine ve insertedtablo buna göre doldurulur.

İzinler

Kaynak tablo ve INSERT, update üzerinde seçme iznine veya hedef tablo silme izinlerini gerektirir. Ek bilgi için bkz: İzinler bölümünde seçin, Ekle, güncelleştirme, ve silmek konular.

Örnekler

A.Tek bir deyimi tablo Ekle ve GÜNCELLEŞTIR işlemleri gerçekleştirmek için birleştirme kullanma

Bir yaygın senaryo eşleşen bir satır varsa, bir tablodaki bir veya daha fazla sütun güncelleştirme veya eşleşen bir satır yoksa yeni satır veri ekleme. Bu genellikle uygun update ve INSERT deyimleri içeren bir saklı yordam parametreleri geçirerek yapılır. BIRLEŞTIRME deyimi ile tek bir deyimde hem görevleri gerçekleştirebilirsiniz. Aşağıdaki örnek, hem bir INSERT deyimi hem de bir update deyimi içeren bir saklı yordam gösterir. Yordam daha sonra tek BIRLEŞTIRME deyimini kullanarak eşdeğer işlemler için değiştirilir.

USE AdventureWorks2012;
GO
CREATE PROCEDURE dbo.InsertUnitMeasure
    @UnitMeasureCode nchar(3),
    @Name nvarchar(25)
AS 
BEGIN
    SET NOCOUNT ON;
-- Update the row if it exists.    
    UPDATE Production.UnitMeasure
    SET Name = @Name
    WHERE UnitMeasureCode = @UnitMeasureCode
-- Insert the row if the UPDATE statement failed.   
    IF (@@ROWCOUNT = 0 )
    BEGIN
        INSERT INTO Production.UnitMeasure (UnitMeasureCode, Name)
        VALUES (@UnitMeasureCode, @Name)
    END
END;
GO
-- Test the procedure and return the results.
EXEC InsertUnitMeasure @UnitMeasureCode = 'ABC', @Name = 'Test Value';
SELECT UnitMeasureCode, Name FROM Production.UnitMeasure
WHERE UnitMeasureCode = 'ABC';
GO

-- Rewrite the procedure to perform the same operations using the MERGE statement.
-- Create a temporary table to hold the updated or inserted values from the OUTPUT clause.
CREATE TABLE #MyTempTable
    (ExistingCode nchar(3),
     ExistingName nvarchar(50),
     ExistingDate datetime,
     ActionTaken nvarchar(10),
     NewCode nchar(3),
     NewName nvarchar(50),
     NewDate datetime
    );
GO
ALTER PROCEDURE dbo.InsertUnitMeasure
    @UnitMeasureCode nchar(3),
    @Name nvarchar(25)
AS 
BEGIN
    SET NOCOUNT ON;

    MERGE Production.UnitMeasure AS target
    USING (SELECT @UnitMeasureCode, @Name) AS source (UnitMeasureCode, Name)
    ON (target.UnitMeasureCode = source.UnitMeasureCode)
    WHEN MATCHED THEN 
        UPDATE SET Name = source.Name
    WHEN NOT MATCHED THEN   
        INSERT (UnitMeasureCode, Name)
        VALUES (source.UnitMeasureCode, source.Name)
        OUTPUT deleted.*, $action, inserted.* INTO #MyTempTable;
END;
GO
-- Test the procedure and return the results.
EXEC InsertUnitMeasure @UnitMeasureCode = 'ABC', @Name = 'New Test Value';
EXEC InsertUnitMeasure @UnitMeasureCode = 'XYZ', @Name = 'Test Value';
EXEC InsertUnitMeasure @UnitMeasureCode = 'ABC', @Name = 'Another Test Value';

SELECT * FROM #MyTempTable;
-- Cleanup 
DELETE FROM Production.UnitMeasure WHERE UnitMeasureCode IN ('ABC','XYZ');
DROP TABLE #MyTempTable;
GO

B.GÜNCELLEŞTİRME gerçekleştirmek için mektup birleştirme kullanarak ve silme işlemlerini tek bir deyimi tablo

Aşağıdaki örnek, güncelleştirmek için birleştirme kullanır. ProductInventoryiçinde tablo AdventureWorksörnek veritabanı günlük olarak işlenir siparişlerine göre SalesOrderDetailtablo. QuantitySütununda ProductInventorytablosu, her gün her ürün için verilen siparişlerin sayısını çıkararak güncellenir SalesOrderDetailtablosu. Bir ürün için sipariş sayısını düzey 0 ürün ya da daha az stok düşerse, o ürünün satır silinir ProductInventorytablosu.

USE AdventureWorks2012;
GO
IF OBJECT_ID (N'Production.usp_UpdateInventory', N'P') IS NOT NULL DROP PROCEDURE Production.usp_UpdateInventory;
GO
CREATE PROCEDURE Production.usp_UpdateInventory
    @OrderDate datetime
AS
MERGE Production.ProductInventory AS target
USING (SELECT ProductID, SUM(OrderQty) FROM Sales.SalesOrderDetail AS sod
    JOIN Sales.SalesOrderHeader AS soh
    ON sod.SalesOrderID = soh.SalesOrderID
    AND soh.OrderDate = @OrderDate
    GROUP BY ProductID) AS source (ProductID, OrderQty)
ON (target.ProductID = source.ProductID)
WHEN MATCHED AND target.Quantity - source.OrderQty <= 0
    THEN DELETE
WHEN MATCHED 
    THEN UPDATE SET target.Quantity = target.Quantity - source.OrderQty, 
                    target.ModifiedDate = GETDATE()
OUTPUT $action, Inserted.ProductID, Inserted.Quantity, Inserted.ModifiedDate, Deleted.ProductID,
    Deleted.Quantity, Deleted.ModifiedDate;
GO

EXECUTE Production.usp_UpdateInventory '20030501'

C.GÜNCELLEŞTİRME gerçekleştirmek için mektup birleştirme kullanarak ve ekleme işlemleri kullanarak türetilmiş kaynak tabloyu hedef tablo

Aşağıdaki örnek, değişiklik yapmak için birleştirme kullanır SalesReasongüncelleştirme veya satır ekleme, tablo. Kaynak tablodaki NewName sütununun değeri hedef tablonun Name sütunundaki bir değer ile eşleştiğinde, (SalesReason), ReasonType sütun hedef tabloda güncelleştirilir. NewName sütununun değeri eşleşmediğinde, kaynak satır hedef tabloya eklenir. Kaynak tablo kullanır türetilmiş bir tablo olduğunu Transact-SQLbirden fazla kaynak tablo satırlarını belirtmek için Tablo değeri Oluşturucu. Tablo değeri Oluşturucu türetilmiş bir tablo kullanma hakkında daha fazla bilgi için bkz: Tablo Değeri Oluşturucusu (Transact-SQL). Örnek de bir tablo değişkeni output yan tümcesi sonucu depolamak ve daha sonra eklenen ve güncelleştirilen satır sayısı verir basit seçme işlemi gerçekleştirerek birleştirme statment sonuçlarını özetlemek gösterilmiştir.

USE AdventureWorks2012;
GO
-- Create a temporary table variable to hold the output actions.
DECLARE @SummaryOfChanges TABLE(Change VARCHAR(20));

MERGE INTO Sales.SalesReason AS Target
USING (VALUES ('Recommendation','Other'), ('Review', 'Marketing'), ('Internet', 'Promotion'))
       AS Source (NewName, NewReasonType)
ON Target.Name = Source.NewName
WHEN MATCHED THEN
    UPDATE SET ReasonType = Source.NewReasonType
WHEN NOT MATCHED BY TARGET THEN
    INSERT (Name, ReasonType) VALUES (NewName, NewReasonType)
OUTPUT $action INTO @SummaryOfChanges;

-- Query the results of the table variable.
SELECT Change, COUNT(*) AS CountPerChange
FROM @SummaryOfChanges
GROUP BY Change;

D.BIRLEŞTIRME deyimini sonuçları başka bir tabloya 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şlerine göre tablo, SalesOrderDetailtablosu. Örneğin güncelleştirilir ve bunları stok değişiklikleri izlemek için kullanılan başka bir tabloya ekler satır yakalar.

USE AdventureWorks2012;
GO
CREATE TABLE Production.UpdatedInventory
    (ProductID INT NOT NULL, LocationID int, NewQty int, PreviousQty int,
     CONSTRAINT PK_Inventory PRIMARY KEY CLUSTERED (ProductID, LocationID));
GO
INSERT INTO Production.UpdatedInventory
SELECT ProductID, LocationID, NewQty, PreviousQty 
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 BETWEEN '20030701' AND '20030731'
            GROUP BY ProductID) AS src (ProductID, OrderQty)
     ON pi.ProductID = src.ProductID
    WHEN MATCHED AND pi.Quantity - src.OrderQty >= 0 
        THEN UPDATE SET pi.Quantity = pi.Quantity - src.OrderQty
    WHEN MATCHED AND pi.Quantity - src.OrderQty <= 0 
        THEN DELETE
    OUTPUT $action, Inserted.ProductID, Inserted.LocationID, Inserted.Quantity AS NewQty, Deleted.Quantity AS PreviousQty)
 AS Changes (Action, ProductID, LocationID, NewQty, PreviousQty) WHERE Action = 'UPDATE';
GO

Ayrıca bkz.

Başvuru

select (Transact-sql)

Insert (Transact-sql)

Güncelleştirme (Transact-sql)

Sil (Transact-sql)

output Yantümcesi (Transact-sql)

FROM (Transact-sql)

Tablo Değeri Oluşturucusu (Transact-SQL)

Kavramlar

Tümleştirme Hizmetleri paketlerini birleştirme