{"id":8178,"date":"2022-05-13T07:00:11","date_gmt":"2022-05-13T05:00:11","guid":{"rendered":"https:\/\/sii.pl\/blog\/?p=8178"},"modified":"2026-05-07T14:45:32","modified_gmt":"2026-05-07T12:45:32","slug":"polecenie-merge-w-tsql-oraz-wykorzystanie-klauzuli-output","status":"publish","type":"post","link":"https:\/\/sii.pl\/blog\/polecenie-merge-w-tsql-oraz-wykorzystanie-klauzuli-output\/","title":{"rendered":"Polecenie MERGE w TSQL oraz wykorzystanie klauzuli OUTPUT"},"content":{"rendered":"\n<p>Polecenie MERGE zosta\u0142o wprowadzone w Microsoft SQL Server w wersji 2008. Jego w\u0142a\u015bciwo\u015bci\u0105 oraz niew\u0105tpliw\u0105 zalet\u0105 dla programisty jest u\u017cycie operacji wstawiania, aktualizowania lub usuwania (INSERT, UPDATE, DELETE) danych w tabeli w ramach jednego polecenia MERGE. Dzi\u0119ki temu nie musimy pisa\u0107 wyra\u017ce\u0144 INSERT, UPDATE, DELETE oddzielnie, lecz ca\u0142\u0105 logik\u0119 mo\u017cemy zawrze\u0107 w jednym poleceniu.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Instrukcja MERGE \u2013 wprowadzenie<\/h2>\n\n\n\n<p>Najwa\u017cniejsza zalet\u0105 instrukcji MERGE, z punktu widzenia wydajno\u015bci, jest to, \u017ce dane odczytywane s\u0105 tylko raz. Natomiast przy u\u017cyciu trzech oddzielnych polece\u0144: INSERT, UPDATE, DELETE dane zostan\u0105 odczytane \u0142\u0105cznie trzy razy \u2013 oddzielnie dla ka\u017cdego polecenia.<\/p>\n\n\n\n<p>Operacja MEGRE wykonuje dzia\u0142ania na danej tabeli \u201eTARGET\u201d w oparciu o zbi\u00f3r danych \u201eSOURCE\u201d, do kt\u00f3rego odnosimy si\u0119 (mo\u017ce to by\u0107 tabela lub np. wynik zapytania SELECT) poprzez por\u00f3wnanie \u201eTARGET\u201d z \u201eSOURCE\u201d na podstawie okre\u015blonych przez nas warunk\u00f3w i, w zale\u017cno\u015bci od wyniku tego por\u00f3wnania, zastosowanie jednej z operacji: INSERT, UPDATE, DELETE.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Sk\u0142adnia<\/h2>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; title: ; notranslate\" title=\"\">\nMERGE &lt;target_table&gt; &#x5B;AS TARGET]\nUSING &lt;table_source&gt; &#x5B;AS SOURCE]\nON &lt;search_condition&gt;\n&#x5B;WHEN MATCHED\nTHEN &lt;merge_matched&gt; ]\n&#x5B;WHEN NOT MATCHED &#x5B;BY TARGET]\nTHEN &lt;merge_not_matched&gt; ]\n&#x5B;WHEN NOT MATCHED BY SOURCE\nTHEN &lt;merge_matched&gt; ];\n<\/pre><\/div>\n\n\n<h2 class=\"wp-block-heading\">Operator MERGE \u2013 do czego s\u0142u\u017cy?<\/h2>\n\n\n\n<p>Operator MERGE mo\u017ce s\u0142u\u017cy\u0107 do synchronizowania danych pomi\u0119dzy tabelami np. kiedy chcemy doda\u0107 do tabeli \u201eTARGET\u201d rekordy, kt\u00f3re istniej\u0105 w por\u00f3wnywanej tabeli \u201eSOURCE\u201d oraz jednocze\u015bnie zaktualizowa\u0107 te ju\u017c istniej\u0105ce w \u201eTARGET\u201d do stanu z \u201eSOURCE\u201d. Oczywi\u015bcie \u2013 kluczem synchronizuj\u0105cym dane b\u0119dzie warunek przez nas u\u017cyty, po kt\u00f3rym rekordy w tabelach maj\u0105 by\u0107 sprawdzane.<\/p>\n\n\n\n<p>W powy\u017cszym przypadku widz\u0119 zastosowanie polecenia MERGE jako elementu procedur zasilaj\u0105cych dane do tabel narastaj\u0105co oraz z jednoczesn\u0105 mo\u017cliwo\u015bci\u0105 aktualizacji istniej\u0105cych ju\u017c w tabeli danych z poprzednich dni do aktualnego stanu \u2013 np. jako element procedury wywo\u0142ywanej automatyczne w ramach proces\u00f3w ETL.<\/p>\n\n\n\n<p>Dobrym przyk\u0142adem zastosowania polecenia MERGE mo\u017ce by\u0107 r\u00f3wnie\u017c synchronizacja danych w tabelach pomi\u0119dzy r\u00f3\u017cnymi \u015brodowiskami \u2013 testowym i produkcyjnym. Dobr\u0105 praktyk\u0105 w takim przypadku b\u0119dzie u\u017cycie, w warunkach por\u00f3wnania tabel \u201eTARGET\u201d i \u201eSOURCE\u201d, kolumny\/kolumn, kt\u00f3re stanowi\u0105 klucz g\u0142\u00f3wny tabeli. Zapewni to unikalno\u015b\u0107 por\u00f3wnywanych rekord\u00f3w i uchroni nas przed potencjalnym b\u0142\u0119dem zdublowania rekord\u00f3w i, tym samym, \u201epopsuciem\u201d danych w tabeli.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Warto zapami\u0119ta\u0107<\/h2>\n\n\n\n<p>Stosuj\u0105c zapytanie MERGE nale\u017cy pami\u0119ta\u0107, \u017ce:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>W jednym poleceniu MERGE mo\u017cemy zastosowa\u0107 tylko jedno polecenie INSERT, jedno UPDATE i jedno DELETE. Nie mo\u017cemy zastosowa\u0107 w ramach jednego MEGRE np. wielu INSERT-\u00f3w lub pozosta\u0142ych funkcji wi\u0119cej ni\u017c jeden raz.<\/li>\n\n\n\n<li>Przy u\u017cyciu instrukcji MERGE nale\u017cy okre\u015bli\u0107 co najmniej jedn\u0105 z trzech klauzul MATCHED.<\/li>\n\n\n\n<li>Wyra\u017cenie MERGE ko\u0144czy si\u0119 \u015brednikiem.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Przyk\u0142ad zastosowania polecenia MERGE<\/h2>\n\n\n\n<p>Dla zaprezentowania dzia\u0142ania MERGE pos\u0142u\u017c\u0119 si\u0119 tabel\u0105 ze spisem produkt\u00f3w sprzedawanych w sklepie. W pierwszym kroku stworze tabel\u0119 \u201eProducts\u201d, kt\u00f3ra zawiera informacj\u0119 o produktach, kt\u00f3re by\u0142y dotychczas sprzedawane (z unikalnym id dla ka\u017cdego produktu) oraz informacj\u0119 o nazwie oraz cenie.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; title: ; notranslate\" title=\"\">\nCreate table Products (\nProduct_ID int primary key ,\nProductName nvarchar (100) ,\nPrice money )\n \nGO\n \ninsert into Products\nValues\n( 1 , 'Herbata' , 10.50 ) ,\n( 2 , 'Kawa' , 25.00 ) ,\n( 3 , 'Czekolada' , 5.50 ) ,\n( 4 , 'Ciastka' ,  3.50 ) ,\n( 5 , 'Jogurt' , 2.50 ) ,\n( 6 , 'Maslo' , 5.50 )\n \nGO\n<\/pre><\/div>\n\n\n<p>Dodatkowo, tworz\u0119 tabel\u0119 \u201eCurrent_Products\u201d, kt\u00f3ra zawiera aktualizacj\u0119 bie\u017c\u0105cej oferty \u2013 produkty, kt\u00f3re s\u0105 aktualnie oferowane oraz aktualne ceny.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; title: ; notranslate\" title=\"\">\ncreate table Current_Products (\nProduct_ID int primary key ,\nProductName nvarchar (100) ,\nCurrent_Price  money )\n \ninsert into  Current_Products\nValues\n( 1 , 'Herbata' , 11.50 ) ,\n( 2 , 'Kawa' , 28.00 ) ,\n( 3 , 'Czekolada' , 5.50 ) ,\n( 4 , 'Ciastka czekoladowe' ,  3.50 ) ,\n( 7 , 'Ketchup' , 7.00 )\nGO\n<\/pre><\/div>\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; title: ; notranslate\" title=\"\">\nselect *\nfrom Products\n \nselect *\nfrom Current_Products\n<\/pre><\/div>\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/05\/Tabele-294x300-1.jpg\"><img decoding=\"async\" width=\"294\" height=\"300\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/05\/Tabele-294x300-1.jpg\" alt=\"\" class=\"wp-image-17945\"\/><\/a><\/figure>\n\n\n\n<p>Zadanie, kt\u00f3re chc\u0119 wykona\u0107, to zaktualizowa\u0107 tabel\u0119 \u201eProducts\u201d w oparciu o \u201eCurrent_Products\u201d w taki spos\u00f3b, aby zawiera\u0142a informacj\u0119 tylko o aktualnej ofercie. Zale\u017cy mi na tym, aby dla produkt\u00f3w, kt\u00f3re powinny zosta\u0107 w tabeli \u201eProducts\u201d sprawdzi\u0107, czy maj\u0105 aktualn\u0105 cen\u0119 oraz nazw\u0119 produktu (w\u0142a\u015bciwa dla danego Product_ID). Je\u015bli nie, to zaktualizowa\u0107, je\u015bli pojawi\u0142y si\u0119 nowe produkty w \u201eCurrent_Products\u201d, to je doda\u0107 do \u201eProducts\u201d, a je\u015bli w \u201eProducts\u201d znajduj\u0105 si\u0119 takie, kt\u00f3rych ju\u017c nie ma w aktualnej ofercie, to usun\u0105\u0107 z tabeli.<\/p>\n\n\n\n<p>W tym celu wykorzystam polecenie MERGE, kt\u00f3re \u015bwietnie nadaje si\u0119 do realizacji tego zadania.<\/p>\n\n\n\n<p>Jako warunku por\u00f3wnania tabel, u\u017cyj\u0119 atrybutu Product_ID, kt\u00f3ry jednoznacznie identyfikuje rekordy w obu tabelach.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; title: ; notranslate\" title=\"\">\nMERGE Products as TARGET\nUSING Current_Products as SOURCE\nON TARGET.Product_ID = SOURCE.Product_ID\n \nWHEN MATCHED and TARGET.ProductName &lt;&gt; SOURCE.ProductName or TARGET.Price &lt;&gt; SOURCE.Current_Price\nTHEN UPDATE\nset TARGET.ProductName = SOURCE.ProductName ,\nTARGET.Price = SOURCE.Current_Price\n \nWHEN NOT MATCHED BY TARGET THEN\nINSERT ( Product_ID , ProductName , Price)\nValues ( SOURCE.Product_ID , SOURCE.ProductName , SOURCE.Current_Price )\n \nWHEN NOT MATCHED BY SOURCE THEN\nDELETE\nOUTPUT $action as action ,\ninserted.Product_ID as Product_ID,\ninserted.ProductName as ProductName_New ,\ninserted.Price as Price_New ,\n \ndeleted.Product_ID as Product_ID ,\ndeleted.ProductName as ProductName_Old ,\ndeleted.Price as Price_Old\n;\n<\/pre><\/div>\n\n\n<p>Po uruchomieniu powy\u017cszego kodu mo\u017cemy prze\u015bledzi\u0107, co zosta\u0142o dokonane w poni\u017cszej tabeli \u201eProducts\u201d dla zmodyfikowanych rekord\u00f3w<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full is-resized\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/05\/rys.2-MERGE-wynik-1-1-e1569939750139.jpg\"><img decoding=\"async\" width=\"840\" height=\"265\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/05\/rys.2-MERGE-wynik-1-1-e1569939750139.jpg\" alt=\"\" class=\"wp-image-17939\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/05\/rys.2-MERGE-wynik-1-1-e1569939750139.jpg 840w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/05\/rys.2-MERGE-wynik-1-1-e1569939750139-300x95.jpg 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/05\/rys.2-MERGE-wynik-1-1-e1569939750139-768x242.jpg 768w\" sizes=\"(max-width: 840px) 100vw, 840px\" \/><\/a><\/figure>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">MERGE, OUTPUT, MATCHED<\/h2>\n\n\n\n<p>W tym przyk\u0142adzie do polecenia MERGE doda\u0142em r\u00f3wnie\u017c klauzul\u0119 OUTPUT \u2013 dopisan\u0105 po u\u017cyciu klauzul MATCHED. Dzi\u0119ki zastosowaniu tej instrukcji mo\u017cemy jednocze\u015bnie zobaczy\u0107, jakie dzia\u0142ania w ramach naszego MERGE zosta\u0142y wykonane w tabeli \u201eProducts\u201d. Sprawdzamy, kt\u00f3re rekordy zosta\u0142y zaktualizowane, a kt\u00f3re wstawione lub usuni\u0119te Zastosowanie instrukcji MERGE w tabeli ze spisem produkt\u00f3w sprzedawanych w sklepie \u2013 kolumna \u201eaction\u201d.<\/p>\n\n\n\n<p>Dodatkowo, u\u017cywaj\u0105c polecenia&nbsp;<em>inserted.,<\/em>&nbsp;mamy wy\u015bwietlone informacje o tym, jakie modyfikacje zosta\u0142y dokonane (powy\u017cej zaznaczone na zielono), a dzi\u0119ki poleceniu&nbsp;<em>deleted.,<\/em>&nbsp;jak wygl\u0105da\u0142 stan przed zastosowaniem polecenia MERGE dla zmodyfikowanych rekord\u00f3w (powy\u017cej zaznaczone na czerwono).<\/p>\n\n\n\n<p>Stan tabeli Products po wykonaniu powy\u017cszego polecenia MERGE zawiera list\u0119 tylko aktualnie oferowanych produkt\u00f3w wraz z informacj\u0105 o aktualnych cenach oraz nazwach.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; title: ; notranslate\" title=\"\">\nselect *\nfrom Products\n<\/pre><\/div>\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/05\/tabela2.jpg\"><img decoding=\"async\" width=\"272\" height=\"154\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/05\/tabela2.jpg\" alt=\"\" class=\"wp-image-17941\"\/><\/a><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Instrukcja OUTPUT<\/h2>\n\n\n\n<p>Instrukcje OUTPUT mo\u017cemy stosowa\u0107 r\u00f3wnie\u017c wykonuj\u0105c pojedyncze polecenia INSERT, DELETE lub UPDATE. Wykorzystanie polecenia MERGE razem z OUTPUT, daje nam mo\u017cliwo\u015b\u0107 kontrolowania dokonywanych zmian i przechwytywania informacji o dokonanych modyfikacjach w tabeli. Przyk\u0142adowo, informacje o dokonanych zmianach za pomoc\u0105 polecenia OUTPUT INTO, mo\u017cemy wstawi\u0107 do zmiennej tabelarycznej, w celu wy\u015bwietlenia lub zarchiwizowania rekord\u00f3w.<\/p>\n\n\n\n<p>Aby zobrazowa\u0107 powy\u017cszy przyk\u0142ad u\u017cycia polecenia MERGE, dodatkowo z wy\u015bwietleniem informacji o modyfikacji danych, ponownie przygotuj\u0119 dane w tabelach \u201eProducts\u201d oraz \u201eCurrent_Products\u201d ze stanem produkt\u00f3w do uaktualnienia.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; title: ; notranslate\" title=\"\">\nTRUNCATE TABLE Products\n \ninsert into Products\nValues\n( 1 , 'Herbata' , 10.50 ) ,\n( 2 , 'Kawa' , 25.00 ) ,\n( 3 , 'Czekolada' , 5.50 ) ,\n( 4 , 'Ciastka' ,  3.50 ) ,\n( 5 , 'Jogurt' , 2.50 ) ,\n( 6 , 'Maslo' , 5.50 )\n \nGO\n \nTRUNCATE TABLE Current_Products\n \ninsert into  Current_Products\nValues\n( 1 , 'Herbata' , 11.50 ) ,\n( 2 , 'Kawa' , 28.00 ) ,\n( 3 , 'Czekolada' , 5.50 ) ,\n( 4 , 'Ciastka czekoladowe' ,  3.50 ) ,\n( 7 , 'Ketchup' , 7.00 )\n \nGO\n<\/pre><\/div>\n\n\n<p>Aby wy\u015bwietli\u0107 informacje o dokonanych zmianach, deklaruj\u0119 zmienn\u0105 tabelaryczn\u0105&nbsp;<em>@arch,<\/em>&nbsp;a nast\u0119pnie wstawiam wyniki polecenia OUTPUT do tej zmiennej, za pomoc\u0105 polecenia OUTPUT INTO.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; title: ; notranslate\" title=\"\">\ndeclare @arch table\n( action varchar(10) ,\nProduct_ID int ,\nProductName nvarchar (100) ,\nPrice money );\nMERGE Products as TARGET\nUSING Current_Products as SOURCE\nON TARGET.Product_ID = SOURCE.Product_ID\n \nWHEN MATCHED and TARGET.ProductName &lt;&gt; SOURCE.ProductName or TARGET.Price &lt;&gt; SOURCE.Current_Price\nTHEN UPDATE\nset TARGET.ProductName = SOURCE.ProductName ,\nTARGET.Price = SOURCE.Current_Price\n \nWHEN NOT MATCHED BY TARGET THEN\nINSERT ( Product_ID , ProductName , Price)\nValues ( SOURCE.Product_ID , SOURCE.ProductName , SOURCE.Current_Price )\n \nWHEN NOT MATCHED BY SOURCE THEN\nDELETE\nOUTPUT $action as action ,\ndeleted.Product_ID as Product_ID ,\ndeleted.ProductName as ProductName_Old ,\ndeleted.Price as Price_Old\n \nINTO @arch ;\n \nselect *\nfrom @arch\nwhere action in (&#039;UPDATE&#039; ,&#039;DELETE&#039; ) ;\n<\/pre><\/div>\n\n\n<p>W poleceniu SELECT wy\u015bwietli\u0142em informacje o stanie zmodyfikowanych rekord\u00f3w przed zastosowaniem zmian w tabeli Products z informacj\u0105, czy by\u0142a to aktualizacja, czy te\u017c usuni\u0119cie rekordu z tabeli.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/05\/tabela3.jpg\"><img decoding=\"async\" width=\"299\" height=\"156\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/05\/tabela3.jpg\" alt=\"\" class=\"wp-image-17943\"\/><\/a><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">MERGE \u2013 przydatne informacje<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Si\u0142\u0105 MERGE jest mo\u017cliwo\u015b\u0107 u\u017cycia kilku operacji jednocze\u015bnie w ramach jednego polecenia i jednego odczytu. Nale\u017cy pami\u0119ta\u0107, \u017ce u\u017cycie pojedynczej operacji modyfikacji danych (INSERT, UPDATE, DELETE) poza poleceniem MERGE b\u0119dzie bardziej wydajne, ni\u017c u\u017cycie w instrukcji MERGE tylko z np. samym INSERT. Je\u015bli mamy do wykonania tylko jedno polecenie modyfikacji, przy du\u017cej ilo\u015bci danych nale\u017cy si\u0119 zastanowi\u0107 nad u\u017cyciem takiego polecenia bez zawierania w MERGE.<\/li>\n\n\n\n<li>W celu poprawienia wydajno\u015bci polecenia MERGE, przy dzia\u0142aniu na bardzo du\u017cej ilo\u015bci danych, zalecane jest za\u0142o\u017cenie indeks\u00f3w w tabelach dla kolumn u\u017cywanych w warunku z\u0142\u0105czenia:<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Za\u0142o\u017cenie unikalnego i pokrywaj\u0105cego indeksu dla kolumn z\u0142\u0105czenia w tabeli SOURCE.<\/li>\n\n\n\n<li>Za\u0142o\u017cenie unikalnego indeksu klastrowego w tabeli TARGET dla kolumn z\u0142\u0105czenia.<\/li>\n<\/ol>\n\n\n\n<p>W moim powy\u017cszym przyk\u0142adzie, do warunku z\u0142\u0105czenia w poleceniu MERGE u\u017cywam kolumn Product_ID, kt\u00f3re zar\u00f3wno w tabeli \u201eProducts\u201d, jak i \u201eCurrent_Products\u201d stanowi\u0105 klucz g\u0142\u00f3wny, a wi\u0119c unikalny indeks klastrowy.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Instrukcja @@ROWCOUNT u\u017cyta po poleceniu MERGE zwraca ca\u0142kowit\u0105 liczb\u0119 wierszy jakie zosta\u0142y zmodyfikowane w ramach MERGE, czyli \u0142\u0105czn\u0105 ilo\u015bci wierszy z wszystkich instrukcji INSERT, UPDATE i DELETE, jakie by\u0142y zastosowane w MERGE \u2013 jedn\u0105 sum\u0119 rekord\u00f3w wstawionych, zaktualizowanych oraz usuni\u0119tych.<\/li>\n\n\n\n<li>Polecenie MERGE nie jest obs\u0142ugiwane na Azure SQL Data Warehouse.<\/li>\n<\/ul>\n\n\n<div class=\"nsw-o-blogersii-banner\">\n            <picture>\n            <source srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/04\/Blog-Data-Analytics-Desktop_.jpg\" media=\"(min-width: 992px)\" >\n            <source srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/04\/Blog-Data-Analytics-Mob_.jpg\" media=\"(min-width: 300px)\" >            <img decoding=\"async\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/04\/Blog-Data-Analytics-Desktop_.jpg\" alt=\"\"  class=\"\"  >\n        <\/picture>\n        <div class=\"cnt\">\n                    <div class=\"nsw-m-title-block -h3 -invert  -has-title-margin-bottom-0 -has-title-font-weight-bold\">\n                                <h2 class=\"nsw-m-title-block__title\">Data &#038; Analytics<\/h2>\n                <\/div>\n                            <p class=\"has-nsw-p-4-font-size has-invert-color\">\n                Dzi\u0119ki naszym us\u0142ugom analizy i przetwarzania danych b\u0119dziesz podejmowa\u0107 trafne decyzje, zbudujesz skuteczne strategie i znajdziesz nowe \u017ar\u00f3d\u0142a przychod\u00f3w.\n            <\/p>\n                            <a  href=\"https:\/\/sii.pl\/oferta\/data-analytics\/\" class=\"nsw-a-button -ghost -banner-button\"   >\n        <span>Oferta Data&amp;Analytics<\/span>\n    <\/a>\n            <\/div>\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Podsumowanie<\/h2>\n\n\n\n<p>Dzi\u0119ki poleceniu MERGE, programi\u015bci mog\u0105 skuteczniej obs\u0142ugiwa\u0107 typowe scenariusze hurtowni danych, takie jak sprawdzanie czy istnieje wiersz, a nast\u0119pnie wykonywanie operacji INSERT, UPDATE lub DELETE.<\/p>\n\n\n\n<p>Poprzez mo\u017cliwo\u015b\u0107 jednoczesnego zastosowania kilku operacji, instrukcja MERGE mo\u017ce poprawi\u0107 czytelno\u015b\u0107 kodu (jedno polecenie) oraz wydajno\u015b\u0107 (jeden odczyt). Jednak nale\u017cy pami\u0119ta\u0107, \u017ce nie uzyskamy poprawy wydajno\u015bci stosuj\u0105c MERGE z tylko jednym poleceniem.<\/p>\n\n\n\n<p>Je\u017celi polecenie MEGRE b\u0119dzie wykorzystywane cyklicznie przy du\u017cych ilo\u015bciach danych, np. w ramach proces\u00f3w ETL jako element procedury \u0142aduj\u0105cej dane codziennie w celu poprawienia wydajno\u015bci, nale\u017cy si\u0119 zastanowi\u0107 nad za\u0142o\u017ceniem indeks\u00f3w w wykorzystywanych tabelach na kolumnach z\u0142\u0105czenia.<\/p>\n\n\n\n<p>Wykorzystuj\u0105c instrukcj\u0119 OUTPUT razem z poleceniem MERGE mo\u017cemy weryfikowa\u0107 wynik dzia\u0142a\u0144 jakie wykonujemy i przechwytywa\u0107 informacj\u0119 o dokonanych zmianach, dla procesu kontroli lub archiwizacji danych.<\/p>\n\n\n\n<p>***<\/p>\n\n\n\n<p>Jesli interesuj\u0105 Ci\u0119 zagadnienia&nbsp;<a href=\"https:\/\/sii.pl\/blog\/architektura-lakehouse-koncepcja-delta-lake-w-usludze-databricks\/\" class=\"ek-link\">Architektury Lakehouse i koncepcji Data Lake<\/a>&nbsp;lub zastanawiasz si\u0119,&nbsp;<a href=\"https:\/\/sii.pl\/blog\/tabele-i-kolumny-czy-moze-grafy-dokumenty-i-mapy-czyli-jaki-mamy-wybor-planujac-bazy-danych\/\" class=\"ek-link\">jak graficznie zaplanowa\u0107 bazy danych<\/a>, zach\u0119camy do zapoznania si\u0119 z artyku\u0142ami specjalist\u00f3w Sii.<\/p>\n\n\n<div class=\"kk-star-ratings kksr-auto kksr-align-left kksr-valign-bottom\"\n    data-payload='{&quot;align&quot;:&quot;left&quot;,&quot;id&quot;:&quot;8178&quot;,&quot;slug&quot;:&quot;default&quot;,&quot;valign&quot;:&quot;bottom&quot;,&quot;ignore&quot;:&quot;&quot;,&quot;reference&quot;:&quot;auto&quot;,&quot;class&quot;:&quot;&quot;,&quot;count&quot;:&quot;11&quot;,&quot;legendonly&quot;:&quot;&quot;,&quot;readonly&quot;:&quot;&quot;,&quot;score&quot;:&quot;5&quot;,&quot;starsonly&quot;:&quot;&quot;,&quot;best&quot;:&quot;5&quot;,&quot;gap&quot;:&quot;2&quot;,&quot;greet&quot;:&quot;&quot;,&quot;legend&quot;:&quot;5\\\/5&quot;,&quot;size&quot;:&quot;30&quot;,&quot;title&quot;:&quot;Polecenie MERGE w TSQL oraz wykorzystanie klauzuli OUTPUT&quot;,&quot;width&quot;:&quot;159&quot;,&quot;_legend&quot;:&quot;{score}\\\/5&quot;,&quot;font_factor&quot;:&quot;1.25&quot;}'>\n            \n<div class=\"kksr-stars\">\n    \n<div class=\"kksr-stars-inactive\">\n            <div class=\"kksr-star\" data-star=\"1\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"2\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"3\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"4\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"5\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n    <\/div>\n    \n<div class=\"kksr-stars-active\" style=\"width: 159px;\">\n            <div class=\"kksr-star\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n    <\/div>\n<\/div>\n                \n\n<div class=\"kksr-legend\" style=\"font-size: 24px;\">\n            5\/5    <\/div>\n    <\/div>\n","protected":false},"excerpt":{"rendered":"<p>Polecenie MERGE zosta\u0142o wprowadzone w Microsoft SQL Server w wersji 2008. Jego w\u0142a\u015bciwo\u015bci\u0105 oraz niew\u0105tpliw\u0105 zalet\u0105 dla programisty jest u\u017cycie &hellip; <a class=\"continued-btn\" href=\"https:\/\/sii.pl\/blog\/polecenie-merge-w-tsql-oraz-wykorzystanie-klauzuli-output\/\">Continued<\/a><\/p>\n","protected":false},"author":168,"featured_media":14794,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_editorskit_title_hidden":false,"_editorskit_reading_time":0,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","inline_featured_image":false,"footnotes":""},"categories":[1314],"tags":[421,848],"class_list":["post-8178","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-development-na-twardo","tag-bi","tag-tsql"],"acf":[],"aioseo_notices":[],"republish_history":[],"featured_media_url":"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/05\/Polecenie-MERGE-w-TSQL-oraz-wykorzystanie-klauzuli-OUTPUT-1.jpg","category_names":["Development na twardo"],"_links":{"self":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/8178"}],"collection":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/users\/168"}],"replies":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/comments?post=8178"}],"version-history":[{"count":2,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/8178\/revisions"}],"predecessor-version":[{"id":33828,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/8178\/revisions\/33828"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media\/14794"}],"wp:attachment":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media?parent=8178"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/categories?post=8178"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/tags?post=8178"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}