خوش آموز درخت تو گر بار دانش بگیرد، به زیر آوری چرخ نیلوفری را


استفاده از دستور MERGE در SQL Server

استفاده از دستور MERGE در SQL Server
از دستور MERGE در SQL server برای غیر داده ها در یک جدول مقصد بر اساس داده های موجود در جدول منبع استفاده می شود. این دستور با استفاده از یک ستون مشترک در هر دو جدول ، جدول مقصد را به جدول منبع جوین می دهد.

نرم افزار سامانه مودیان راهکار
Syntax کلی استفاد از MERGE بصورت زیر می باشد.



MERGE target_table USING source_table
ON condition
WHEN MATCHED
THEN update_statement
WHEN NOT MATCHED BY TARGET
THEN insert_statement
WHEN NOT MATCHED BY SOURCE
THEN DELETE;

MERGE AND USING: جدول سورس و جدول مقصد برای ادغام دستورات با استفاده از کلمه کلیدی مشخص شده اند
CONDITION: جدول منبع با سطرهای جدول مقصد مطابقت دارد. این حالت شبیه شرط join در استفاده از دستور join است.
شرط می تواند سه نتیجه ممکن داشته باشد که در ذیل آنها را ملاحظه خواهید کرد:
MATCHED: وقتی ردیف ها با شرط merge مطابقت داشته باشند، برای ردیف های منطبق، ستون های ردیف را در جدول مقصد با مقادیر جدول سورس آپدیت می کند.
NOT MATCHED BY TARGET: همیشه هم شروط منطبق نیستند. - وقتی ردیف های جدول مبدأ هیچ ردیف منطبقی در جدول مقصد ندارند. در این حالت ، این صورت رکوردها را از جدول منبع به جدول مقصد اضافه می کند.
NOT MATCHED BY SOURCE: وقتی ردیف های جدول مقصد که با هیچ ردیفی در جدول مبدا مطابقت ندارند.

اگر می خواهید جدول مقصد را با داده های جدول مبدا تأیید کنید، از این شرط مطابقت برای حذف ردیف ها از جدول مقصد استفاده می کنید.
مثلا به این مثال از MERGE در SQL Server نگاهی داشته باشیم. فرض کنید که شما دو جدول دارید. یک جدول سورس و یک جدول مقصد و می خواهید داده های جدول مقصد را با جدول منبع برای سه مورد به شرح زیر تأیید کنید.
رکوردها را آپدیت کنید، اگر جدول مقصد دارای ردیف های منطبق با جدول منبع است، رکوردهای جدول مقصد را با مقادیر وارد شده از جدول منبع آپدیت کنید.
رکوردها را insert کنید، اگر جدول منبع دارای ردیف های منطبق با جدول مقصد نیست، ردیف هایی را که در جدول منبع هستند در جدول مقصد اضافه کنید.
رکوردها را حذف کنید. جدول مقصد دارای چند رکورد است که در جدول منبع وجود ندارد ، پس رکوردها را از جدول مقصد حذف کنید تا یکپارچگی داده ها بین جدول منبع و جدول هددف حفظ شود.
برای اجرای منطقی SQL برای چنین شرایطی قطعاً باید سه دستور مختلف SQL برای insert ، update و delete بر اساس مقادیر تطبیق بین جدول منبع و مقصد بنویسید. ولی با MERGE، کار بهتر و کوتاه تر انجام می شود. پس به سراغ مثال از MERGE می رویم.
دو جدول ایجاد می کنیم و مقادیری در اضافه می کنیم.

CREATE TABLE EMP_SRC
(ID INT,
NAME VARCHAR(30),
CODE VARCHAR(10))

CREATE TABLE EMP_TRGT
(ID INT,
NAME VARCHAR(30),
CODE VARCHAR(10))
INSERT INTO EMP_SRC(ID, NAME, CODE)
VALUES(1, 'A', 'A12'),
(2, 'B', 'B12'),
(3, 'C','C12'),
(4, 'D','D12')

INSERT INTO EMP_TRGT(ID, NAME, CODE)
VALUES(1, 'D', NULL),
(2, 'Y', 'Y12'),
(5, 'G','G12'),
(6, 'E','E12')

همانطور که مشاهده می کنید، جدول EMP_SRC و EMP_TRGT را هم اکنون بصورت زیر داریم.

استفاده از دستور MERGE در SQL Server
همانطور که مشاهده می کنید ، جدول منبع و جدول مقصد، ر دو دارای برخی رکوردها و ستون ID در هر دو جدول به عنوان شرط merge هستند.
جایی که ID=1 و 2 است، ردیف های جدول منبع EMP_SRC با ردیف های جدول هدف EMP_TRGT مطابقت دارد ، بنابراین دستور merge مقادیر موجود در فیلدهای NAME و CODE را در جدول EMP_TRGT آپدیت می کند.
جایی که ID =3 و 4 است، رکوردهای جدول منبع EMP_SRC در جدول مقصد EMP_TRGT وجود ندارد، بنابراین دستور merge این ردیف ها را در جدول مقصد اضافه می کند.
جایی که ID = 5 و 6 است، رکوردهای جدول هدف EMP_TRGT در جدول منبع EMP_SRC وجود ندارد ، بنابراین دستور merge این رکوردها را از جدول هدف EMP_TRGT حذف می کند.
برای درک بهتر آنچه که شرح داده شد، به تصویر زیر دقت کنید.

استفاده از دستور MERGE در SQL Server
 MERGE EMP_TRGT  AS TRGT
USING EMP_SRC AS SRC ON SRC.ID = TRGT.ID
WHEN MATCHED
THEN UPDATE SET TRGT.NAME = SRC.NAME, TRGT.CODE = SRC.CODE
WHEN NOT MATCHED BY TARGET
THEN INSERT (ID, NAME, CODE) VALUES (SRC.ID, SRC.NAME, SRC.CODE)
WHEN NOT MATCHED BY SOURCE
THEN DELETE;

استفاده از دستور MERGE در SQL Server
اکنون می توانید رکوردهای جدول EMP_SRC و EMP_TRGT را بررسی کنید.

SELECT * FROM EMP_SRC
SELECT * FROM EMP_TRGT

استفاده از دستور MERGE در SQL Server
همانطور که مشاهده می کنید ، دستور Merge تغییراتی را در جدول مقصد EMP_TRGT براساس مقادیر منطبق در جدول منبع EMP_SRC ایجاد کرده است. شما همچنین امکان Capture کردن رویدادهای delete، update، insert برای رکوردهای جدول را داشته باشید و اینکار با استفاده از دستور OUTPUT می تواند انجام شود.
OUTPUT مقادیر هر رکوردی را که تحت تأثیر عملیاتINSERT ، UPDATE یا DELETE قرار گرفته است را برمی گرداند.
OUTPUT به دو جدول مجازی دسترسی پیدا می کند که Magic Tables نام دارند:
INSERTED شامل رکوردهای جدید است (تنظیم INSERT یا UPDATE)
DELETED حاوی کپی قدیمی ردیف ها است (تنظیم به روزرسانی)
بنابراین با استفاده از OUTPUT در دستور Merge، می توانید رکوردهای اضافه شده، آپدیت شده و حذف شده را مشاهده کنید.

MERGE EMP_TRGT  AS TRGT
USING EMP_SRC AS SRC ON SRC.ID = TRGT.ID
WHEN MATCHED
THEN UPDATE SET TRGT.NAME = SRC.NAME, TRGT.CODE = SRC.CODE
WHEN NOT MATCHED BY TARGET
THEN INSERT (ID,NAME, CODE) VALUES (SRC.ID, SRC.NAME, SRC.CODE)
WHEN NOT MATCHED BY SOURCE
THEN DELETE
OUTPUT
$action,
deleted.*,
inserted.*;

استفاده از دستور MERGE در SQL Server

نمایش دیدگاه ها (1 دیدگاه)

دیدگاه خود را ثبت کنید:

انتخاب تصویر ویرایش حذف
توجه! حداکثر حجم مجاز برای تصویر 500 کیلوبایت می باشد.


دسته بندی مطالب خوش آموز