sql >> Database teknologi >  >> RDS >> Database

FLET:Opdatering af kilde- og måltabeller placeret på separate servere

Hvad er MERGE-sætningen?

Ved at bruge MERGE-sætningen kan vi ændre data i en måltabel baseret på data i en kildetabel. Ved at bruge det kan vi udføre INSERT, UPDATE og DELETE på måltabellerne inden for en enkelt forespørgselsblok. Det forbinder begge tabeller ved hjælp af kolonner, der er fælles i begge tabeller som den primære nøgle. Baseret på hvordan kolonnedata matcher, gælder ændringer for data i måltabellen. Følgende billede illustrerer, hvordan "FLETT" fungerer:

Ved at bruge MERGE kan vi få forbedret ydeevne, fordi alle tre operationer (INSERT, UPDATE og DELETE ) udføres i én omgang. Vi behøver ikke at skrive en individuel erklæring for at opdatere ændringer i måltabellen.

Sammenfletningserklæringen bruger SourceTable og destinationstabel. Den ændrer DestinationTable baseret på data fra SourceTable . Begge tabeller sammenlignes ved hjælp af betingelsen, der er defineret i Merge Statement. Denne betingelse bestemmer, hvordan SourceTable matcher med destinationstabel. Det er ligesom sammenføjningsbetingelser, der bruges til at matche rækker.

Typisk skal matchning udføres ved at matche unikke identifikatorer som primære nøgler. Kildetabellen er f.eks. Nyt produkt og destinationen er Productmaster, og den primære nøgle er ProductID , så skal flettebetingelsen være som følger:

NewProduct.ProductID=ProductMaster.ProdID

Følgende er formatet for MERGE-sætningen:

FLET mål ved at bruge kilden sON joinConditionWHEN MATCHEDTHEN updateQueryWHEN NOT MATCHED BY TARGETTHEN insertQueryWHEN NOT MATCHED BY SOURCETHEN deleteQuery

For at ændre dataene på måltabellen understøtter MERGE følgende T-SQL-klausuler.

  1. NÅR MATCHED
  2. NÅR IKKE MATCHED [VED MÅL]
  3. NÅR IKKE MATCHED [VED KILDE]

“NÅR MATCHED” klausul

Denne klausul vil blive brugt, når vi ønsker at opdatere eller slette posterne på destinationstabellen. Her betragtes registreringer som matchende, når data i de sammenføjede kolonner er de samme.

“NÅR IKKE MATCHED [BY TARGET]”-klausul

Hvis posten er til stede i kildetabellen, men ikke i måltabellen, vil denne klausul blive brugt til at indsætte en ny post i måltabellen.

“NÅR IKKE MATCHED [AF SOURCE]”-klausul

Denne klausul vil blive brugt, når vi ønsker at slette eller opdatere en post i en kildetabel, som ikke matcher en række i måltabellen.

Brug MERGE, når kilden og målet er på en separat server

I denne artikel vil jeg demonstrere, hvordan man udfører indsættelse, opdatering og sletning ved hjælp af MERGE, når kilde- og måltabellerne er på separate servere. For eksempel bruger en medicinalvirksomhed lagersoftware. Masterdatabaser for en software og transaktionsdatabaser af software er på separate databaseservere. Følgende er en opsætning:

Virksomheden har tilføjet nogle få bestilte produkter. Jeg ønsker at udføre et par oprydningsprocesser, mens jeg opdaterer lageret af produkter. Følgende er listen over opgaver, der skal udføres.

  1. Hvis et produkt findes på lager, og det samme produkt blev bestilt, skal du opdatere og derefter opdatere lageret.
  2. Hvis et produkt ikke findes på lageret, og add produkt er bestilt, skal du tilføje produktet på lager.
  3. Hvis produktet findes på lageret, men det ikke er bestilt, opdateres lageret af produktet desuden ikke i mere end et år end at slette produktet fra lageret.

For at udføre ovennævnte opgave udfører vi følgende trin:

  1. Opret en global midlertidig tabel med navnet ##Source_Trn_Tabl e. Udfyld data fra "TrnOrder ” (Kildetabel) ved hjælp af OPENROWSET kommando og gem data i ##Source_Trn_Table .
  2. Udfør INSERT, UPDATE og DELETE operationen på MstStock tabel (Target Table) ved hjælp af FLET søgeord, baseret på følgende betingelser:
    • Hvis værdien af ​​Product_ID kolonne findes i ##Source_Trn_Table og aktien tabel, og opdater derefter den aktuelle aktie i MstStock tabel.
    • Hvis værdien af ​​Product_ID kolonne findes i ##Source_Trn_Table men findes ikke i MstStock tabel, og tilføj derefter et produkt til MstStock tabel.
    • Hvis værdien af ​​Product_ID kolonne findes i MstStock men findes ikke i ##Source_Trn_Tabl e, desuden kolonneværdien last_stock_update_date er større end et år, skal du slette product_id fra MstStock tabel.

Følgende er flowdiagrammet:

Demonstration

Opret først en måltabel med navnet MstStock og MstProduct Product_Master database, placeret på TTI412-VM2 server. Udfør følgende forespørgsel:

BRUG [Product_Master]GOCREATE TABLE [dbo].[MstProduct]( [ID] [int] IDENTITY(1,1) NOT NULL, [Product_ID] [varchar](15) NULL, [Product_Name] [varchar]( 500) IKKE NULL,PRIMÆR NØGLE KLUSTERET ( [ID] ASC) MED (PAD_INDEX =OFF, STATISTICS_NORECOMPUTE =OFF, IGNORE_DUP_KEY =OFF, ALLOW_ROW_LOCKS =ON, ALLOW_PAGE_LOCKS =ON, ALLOW_PAGE_LOCKS =ON)] ONED [WISC PRIMARY)] (PAD_INDEX =FRA, STATISTICS_NORECOMPUTE =FRA, IGNORE_DUP_KEY =FRA, ALLOW_ROW_LOCKS =TIL, ALLOW_PAGE_LOCKS =TIL) PÅ [PRIMÆR]) PÅ [PRIMÆR]GOCREATE TABLE [dbo]]([IDIDstStock1), 1) IKKE NULL, [Product_ID] [varchar](5) IKKE NULL, [Current_Stock] [int] NULL, [Last_Stock_Update_Date] [datetime] NULL,PRIMÆR NØGLE KLUSTERET ( [ID] ASC) MED (PAD_INDEX =OFF, STATISTICS_N OFF, IGNORE_DUP_KEY =OFF, ALLOW_ROW_LOCKS =ON, ALLOW_PAGE_LOCKS =ON) ON [PRIMARY],UNIQUE NOT CLUSTERED ( [Product_ID] ASC)WITH (PAD_INDEX =OFF, STATISTICS_NORECOMPUTE =_ OFF_,IOW_OFF, IALLE AGE_LOCKS =ON) PÅ [PRIMARY]) PÅ [PRIMARY]GO

Tilføj nu nogle data til begge tabeller.

Udfør følgende forespørgsel for at tilføje data til MstProduct tabel:

SET IDENTITY_INSERT dbo.MstProduct ONGOINSERT dbo.MstProduct(ID, Product_ID, Product_Name) VALUES (28, 'MED141', 'Alfimaxin')INSERT dbo.MstProduct(ID, Product_ID, Product_Name) VALUES (29, 'MED142', 'Zylasonmuc')INSERT dbo.MstProduct(ID, Product_ID, Product_Name) VALUES (30, 'MED143', 'Rythmoxabid')INSERT dbo.MstProduct(ID, Product_ID, Product_Name) VALUES (31, 'MED144', 'Omedrozol') INSERT dbo.MstProduct(ID, Product_ID, Product_Name) VALUES (32, 'MED145', 'Reducurzol')INSERT dbo.MstProduct(ID, Product_ID, Product_Name) VALUES (33, 'MED146', 'Losapuritriol')INSERT dbo.MstProduct (ID, Product_ID, Product_Name) VALUES (34, 'MED147', 'Pipepapren')INSERT dbo.MstProduct(ID, Product_ID, Product_Name) VALUES (35, 'MED148', 'Miraperahex')INSERT dbo.MstProduct(ID, Product_ID) , Product_Name) VALUES (36, 'MED149', 'Durachloridevant')INSERT dbo.MstProduct(ID, Product_ID, Product_Name) VALUES (37, 'MED151', 'Renachloridenide')INSERT dbo.MstProduct(ID, Product_ID, Product_Name) VALUES (38, 'MED152 ', 'Ecopurimuc')INSERT dbo.MstProduct(ID, Product_ID, Product_Name) VALUES (39, 'MED153', 'Aerocarpambid')INSERT dbo.MstProduct(ID, Product_ID, Product_Name) VALUES (40, 'MED154', 'Afsitec ')INSERT dbo.MstProduct(ID, Product_ID, Product_Name) VALUES (41, 'MED155', 'Aprozovant')INSERT dbo.MstProduct(ID, Product_ID, Product_Name) VALUES (42, 'MED156', 'Levopafen')INSERT dbo .MstProduct(ID, Product_ID, Product_Name) VALUES (43, 'MED157', 'Medrotraxel')INSERT dbo.MstProduct(ID, Product_ID, Product_Name) VALUES (44, 'MED158', 'Doxxaliq')INSERT dbo.MstProduct(ID) , Product_ID, Product_Name) VALUES (45, 'MED159', 'Betatasine')INSERT dbo.MstProduct(ID, Product_ID, Product_Name) VALUES (46, 'MED161', 'Ciclopatex')INSERT dbo.MstProduct(ID, Product_ID, Product_Name) ) VALUES (47, 'MED162', 'Acadipiphane')INSERT dbo.MstProduct(ID, Product_ID, Product_Name) VALUES (48, 'MED163', 'Septomapin')INSERT dbo.MstProduct(ID, Product_ID, Product_Name) VALUES (49) , 'MED164', 'Acioxenal')INSERT dbo.MstProduct(ID, Pr oduct_ID, Product_Name) VALUES (50, 'MED165', 'Natadrolol')GOSET IDENTITY_INSERT dbo.MstProduct OFFGO

Udfør følgende forespørgsel for at tilføje data til MstStock tabel:

indsæt i MstStock (Product_ID,Current_Stock,Last_Stock_Update_Date) værdier ('MED145',15,'2018-10-14'),('MED146',20,'2018-10-13'),('MED147' ,5,'2018-09-10'),('MED150',5,'2018-08-01'),('MED158',0,'2017-10-14'),('MED159',0 ,'2017-10-14')

Udfør følgende "Vælg"-forespørgsler for at gennemgå outputtet af tabeller.

Forespørgsel:

Brug Product_MasterGoSelect * fra MstProduct

Output:

Forespørgsel:

Brug Product_MasterGoSelect * fra MstStock

Output:

For det andet skal du oprette en kildetabel med navnet TrnOrderInventory_Details database, placeret på TTI412-VM1 server. Udfør følgende forespørgsel:

BRUG [Inventory_Details]GOCREATE TABLE [dbo].[TrnOrder]( [ID] [int] IDENTITY(1,1) NOT NULL, [Product_ID] [varchar](15) NOT NULL, [Ordered_Quty] [int] NULL, [Ordered_Date] [datetime] NULL, [Last_Ordered_Date] [datetime] NULL, PRIMÆR NØGLE KLUSTERET ( [ID] ASC)MED (PAD_INDEX =FRA, STATISTICS_NORECOMPUTE =FRA, IGNORE_DUP_KEY LOCKLOCKLOCKS =OFF_W_ON, PÅ_) [PRIMARY],UNIKK IKKE-KLUNGERET ( [Product_ID] ASC)MED (PAD_INDEX =OFF, STATISTICS_NORECOMPUTE =OFF, IGNORE_DUP_KEY =OFF, ALLOW_ROW_LOCKS =ON, ALLOW_PAGE_LOCKS =ON)]) ON [PRIMARY] 

Udfør følgende forespørgsel for at tilføje data til MstStock tabel:

indsæt i TrnOrder (Product_ID,Ordered_Quty,Ordered_Date,Last_Ordered_Date)værdier ('MED145',10,convert(date,getdate()),'2018-10-14'),('MED146',5,convert( date,getdate()),'2018-10-13'),('MED147',15,convert(date,getdate()),'2018-09-10'),('MED150',200,convert( date,getdate()),'2018-08-01') ,('MED169',50,convert(date,getdate()),'2018-10-14'),('MED170',100,convert( date,getdate()),'2018-10-14')

Udfør følgende "Vælg"-forespørgsel for at gennemgå outputtet af tabellen.

Forespørgsel:

Brug Inventory_DetailsGoSelect * fra TrnOrder

Output:

Opret forbindelse til ekstern SQL Server-instans for at udfylde data

Som jeg nævnte, ønsker vi at opdatere værdierne i "tabel, som er oprettet på en ekstern server. Vi kan få adgang til data fra en ekstern databaseserver ved at bruge følgende metoder.

  1. SQL Server Linked server :Sammenkædet server bruges til at udføre en kommando på OLEDB-datakilden, som er knyttet til ekstern SQL Server-instans. Ved at bruge en sammenkædet server kan du også forespørge på de forskellige databaseprodukter som Oracle. OLEDB-kilder kan konfigureres til at få adgang til Microsoft Access og Excel som en sammenkædet server.
  2. SQL Server OPENROWSET-funktion :Ved at bruge OPENROWSET-funktionen kan vi udføre en ad-hoc-forespørgsel på den eksterne OLEDB-datakilde.

I denne artikel vil vi bruge OPENROWSET metode til at få adgang til data fra fjerntabellen. For at forespørge en fjernserver ved hjælp af OPENROWSET-funktionen skal vi aktivere ad hoc-distribuerede forespørgsler konfigurationsparameter.

"Ad hoc distribuerede forespørgsler" er en avanceret mulighed, derfor skal vi først aktivere Vis avanceret mulighed konfigurationsparameter. For at gøre det skal du udføre følgende kommando i vinduet Query i SQL Server Management Studio.

exec sp_configure 'vis avancerede indstillinger',1omkonfigurer med overrideGo

Når Vis avanceret indstilling parameter er aktiveret, skal du udføre følgende forespørgsel for at aktivere ad hoc distribuerede forespørgsler :

sp_configure 'Ad hoc-distribuerede forespørgsler', 1;RECONFIGURE WITH OVERRIDE;GO

Vi kan ikke bruge "OPENROWSET"-funktionen til at udføre FLOT-operation ved hjælp af data fra fjernserveren. For at gøre det skal vi først importere data fra fjernserveren og gemme dem i den globale midlertidige tabel. Derefter kan vi bruge data, der ligger i den globale midlertidige tabel til at opdatere måltabellen.

Som jeg nævnte, skal vi først importere data fra fjerntabellen. For at gøre det skal du oprette en midlertidig tabel og importere data ved hjælp af OPENROWSET-funktionen.
Følgende forespørgsel vil oprette en global midlertidig tabel.

brug Product_MastergoCREATE TABLE ##Source_Trn_Order( [ID] [int] IDENTITY(1,1) NOT NULL, [Product_ID] [varchar](15) NOT NULL, [Ordered_Quty] [int] NULL, [Ordered_Date] [datetime ] NULL, [Last_Ordered_Date] [datetime] NULL)

Når den midlertidige tabel er oprettet, lad os indlæse data fra en kildetabel, som er placeret på en ekstern server. For at gøre det skal du udføre følgende forespørgsel:

indsæt i ##Source_Trn_Order vælg [Product_ID],[Ordered_Quty],[Ordered_Date],[Last_Ordered_Date] fra OPENROWSET('SQLNCLI', 'Server=TTI609-VM1;Trusted_Connection=yes;',' Ordered_SELECT Product_ID Ordered_Date, Last_Ordered_Date FROM Inventory_Details.dbo.TrnOrder') AS a;

Trin 1:Hvis et produkt findes i MstStock (Target Table) og TrnOrder (Source Table), skal du opdatere den aktuelle mængde i MstStock

For at gøre det skal du bruge NÅR MATCHED klausul. Klausulen forbinder kilde- og måltabeller på de fælles kolonner i begge tabeller. Product_ID kolonne er fælles mellem MstStock og ##Source_Trn_Table, brug den derfor til at forbinde begge tabeller.

Udfør følgende kode:

 FLETT MstStock target_StockUSING ##Source_Trn_Order Source_OrderON target_Stock.Product_Id =Source_Order.Product_Id NÅR MATCHED SÅ OPDATERES SÆT target_Stock.Current_Stock =Source_Order.Ordered_Qty.Current_Stock_date=Getup_Stock_Date=Current_Stock_Date; 

Værdien af ​​Current_Stock-kolonnen på 4 produkter bør opdateres. Udfør følgende forespørgsel for at bekræfte outputtet:

vælg b.Product_ID,b.Product_Name,a.Current_Stock,a.Last_Stock_Update_Date fra MstStock a indre join MstProduct b på a.Product_ID=b.Product_ID og a.Current_Stock>0

Følgende er output:

Trin 2:Hvis et produkt ikke findes i MstStock (Target Table), skal du tilføje det i MstStock (Target Table)

Apotek havde bestilt et par produkter. Disse produkter blev tilføjet i MstProduct-tabellen, men ikke tilføjet til MstStock-tabellen. For at tilføje disse produkter i MstStock tabel, vil jeg bruge NÅR IKKE MATCHED [MÅL]-sætningen. Udtrykket forbinder kilde- og måltabeller ved hjælp af almindelige kolonner. Hvis matchende rækker ikke findes i måltabellen, indsætter den rækker fra kildetabellen.

For at tilføje produkter til MstStock ved at bruge FLUT tabel, skal du udføre følgende kode:

SAMLET mststock target_Stockusing ##source_trn_order Source_OrderON target_Stock.product_id =source_order.product_idWHEN matched THEN UPDATE SET target_Stock.current_stock =Source_Order.ordered_qty + target_Stock.current_Stock.current_stock.current_stock.current_stock.current_stock.current_stock.current_stock.current_stock.current_stock.current_stock.current_stock.current_stock. last_stock_update_date) VALUES (Source_Order.product_id, Source_Order.ordered_qty, Getdate());

To produkt-id'er, MED169 og MED170, skal tilføjes. Udfør følgende forespørgsel for at gennemgå output:

vælg b.Product_ID,b.Product_Name,a.Current_Stock,a.Last_Stock_Update_Date fra MstStock a indre join MstProduct b på a.Product_ID=b.Product_ID og a.Current_Stock>0

Følgende er output:

Trin 3:Slet vare fra MstStock (Target Table), hvis det nuværende lager i MstStock (Target Table) er nul, og produktet ikke er i ##Source_Trn_Order (kildetabel)

På lageret er der få produkter, der skal slettes, fordi de ikke er blevet bestilt siden et år. Derfor skal vi slette dem fra MstStock tabellen og MstProducts tabellen. For at slette disse produkter fra MstStock tabel, kan vi bruge NÅR IKKE MATCHED [KILDE] .

NÅR IKKE MATCHED [KILDE] klausul forbinder kilde- og måltabeller ved hjælp af almindelige kolonner. Hvis matchende rækker ikke findes i kildetabellen, sletter den rækker fra måltabellen.

For at fjerne produkter fra MstStock tabel, skal du udføre følgende kode:

SAMLET mststock target_Stockusing ##source_trn_order Source_OrderON target_Stock.product_id =source_order.product_idWHEN matched THEN UPDATE SET target_Stock.current_stock =Source_Order.ordered_qty + target_Stock.current_Stock.current_stock.current_stock.current_stock.current_stock.current_stock.current_stock.current_stock.current_stock.current_stock.current_stock.current_stock. last_stock_update_date) VÆRDIER (Source_Order.product_id, Source_Order.ordered_qty, Getdate()) NÅR IKKE matches AF KILDE, SÅ SLET;

To produkt-id'er, MED158 og MED159 skal tilføjes. Udfør følgende forespørgsel for at gennemgå output:

vælg b.Product_ID,b.Product_Name,a.Current_Stock,a.Last_Stock_Update_Date fra MstStock a indre join MstProduct b på a.Product_ID=b.Product_ID og a.Current_Stock>0

Følgende er output:

Oversigt

I denne artikel har jeg dækket som følger:

  1. Hvad er MERGE søgeord, og hvordan virker det?
  2. Forskellige klausuler brugt i MERGE til at opdatere kilde- og måltabellen.
  3. Sådan ændres data ved hjælp af MERGE nøgleord, når databaser er på forskellige servere.

Nyttige værktøjer:

dbForge Data Compare til SQL Server – kraftfuldt SQL-sammenligningsværktøj, der kan arbejde med big data.


  1. Hvor vigtig er rækkefølgen af ​​kolonner i indekser?

  2. TO_CHAR(tal) Funktion i Oracle

  3. .NET / Oracle:Sådan udføres et script med DDL-sætninger programmatisk

  4. Pivotdata i T-SQL