خانه SQL Server آشنایی با دستور Merge در SQL Server SQL Server دستورات SQL نوشته شده توسط: تیم فنی نیک آموز تاریخ انتشار: ۰۵ تیر ۱۴۰۰ آخرین بروزرسانی: ۲۵ آبان ۱۴۰۲ زمان مطالعه: 14 دقیقه ۴.۴ (۱۲) مقدمه در این مقاله قصد داریم شما را با دستور (Merge) در SQL Server به صورت مقدماتی آشنا کنیم این دستور از SQL 2008 معرفی شد، با استفاده از دستور Marge میتوان رکوردهای جداول مورد نظر را یکسان سازی کرد. مفاهیم از دستور Merge در SQL Server زمانی استفاده میکنیم که میخواهیم اطلاعات دو جدول را مورد مقایسه قرار بدیم، که این دستور معمولاً با استفاده از یک فیلد که در هر دو جدول مشترک میباشد یک ارتباط (Join) میدهد. که براساس فیلدهای که ما مشخص میکنیم این دستور میتواند سه کار انجام دهد. اگر داده جدول منبع (Source) در جدول مقصد (Target) وجود داشته باشد آنها را به روز رسانی (Update) خواهد کرد. اما اگر اطلاعات جدول source در جدول Target وجود نداشته باشد اطلاعات جدول source را در جدول Target ایجاد (insert) خواهد کرد در واقع اطلاعات هر دو جدول یکسان خواهد بود. و اگر رکوردی در جدول Target وجود داشته باشد اما در جدول Source نباشد آن رکورد از جدول Target حذف خواهد شد. چون در جدول Source ما هیچ تغییراتی نمیتوانیم داشته باشیم. گرامر (Syntax) مربوط به دستور Merge به صورت زیر میباشد. MERGE target_table USING source_table ON merge_condition WHEN MATCHED THEN update_statement WHEN NOT MATCHED THEN insert_statement WHEN NOT MATCHED BY SOURCE THEN DELETE; تاکنون با مفاهیم و کاربرد دستور Merge آشنا شدیم و Syntax مربوط به این دستور را هم در قالب یک کوئری نمایش دادیم در ادامه قصد داریم برای درک بهتر و کاربرد این دستور، یک مثال را پیاده سازی کنیم تا بیشتر با کاربرد دستور Merge آشنا شوید و در پروژههای خود مورد استفاده قرار بدید. برای اینکه مثال مد نظرمان را پیاده سازی کنیم ابتدا باید یک دیتابیس نمونه ایجاد کنیم و بعد دو جدول ایجاده کرده و یکسری رکورد تستی درج کنیم و بعد اطلاعات دو جدول را مورد بررسی قرار میدهیم و در نهایت اگر بین این دو جدول مغایرت اطلاعات داشته باشیم توسط دستور Merge اطلاعات هر دو جدول را یکسان میکنیم. گام اول با استفاده از کوئری زیر بررسی میکنیم که اگر دیتابیسی با نام «Sample» وجود داشت، دیتابیس را به حالت تک کاربره تنظیم میکنیم و دیتابیس را حذف کرده و مجدد ایجاد میکنیم. IF DB_ID('[sample]') > 0 BEGIN ALTER DATABASE [sample] SET SINGLE_USER WITH ROLLBACK IMMEDIATE DROP DATABASE [sample] END GO گام دوم توسط کوئری زیر میخواهیم دیتابیسی با نام «Sample» ایجاد میکنیم. CREATE DATABASE [sample] ON PRIMARY ( NAME = [sample], FILENAME = 'C:\TEMP1\sample_DATA.MDF', SIZE = 100MB, MAXSIZE = 200MB, FILEGROWTH = 64536KB ) LOG ON ( NAME = [sample_log], FILENAME = 'C:\TEMP1\sample_log.LDF', SIZE = 100MB, MAXSIZE = 200MB, FILEGROWTH = 64536KB ); GO گام سوم با استفاده از کوئری زیر اسکیمای با نام (Sales) برای جدول منبع (Source) و جدول هدف (Target) ایجاد میکنیم. CREATE SCHEMA sales; GO گام چهارم با استفاده از کوئری زیر دو جدول ایجاد میکنیم با نام «Category» و «Category_Staging» یکی از جدول به عنوان جدول Source و دیگری به عنوان Target میباشد. CREATE TABLE sales. category ( category_id INT PRIMARY KEY, category_name VARCHAR (255) NOT NULL, amount DECIMAL (10, 2) ); CREATE TABLE sales. Category_staging ( category_id INT PRIMARY KEY, category_name VARCHAR (255) NOT NULL, amount DECIMAL (10, 2) ); گام پنجم درج چند رکورد تستی برای جدول «sales. category » و « sales. Category_staging» توسط کوئری زیر انجام میدهیم. INSERT INTO sales. category (category_id, category_name, amount) VALUES (۱,'Children Bicycles',15000), (۲,'Comfort Bicycles',25000), (۳,'Cruisers Bicycles',13000), (۴,'Cyclocross Bicycles',10000); GO INSERT INTO sales. Category_staging (category_id, category_name, amount) VALUES (۱,'Children Bicycles',15000), (۳,'Cruisers Bicycles',13000), (۴,'Cyclocross Bicycles',20000), (۵,'Electric Bikes',10000), (۶,'Mountain Bikes',10000); GO SELECT * FROM sales. category; SELECT * FROM sales.category_staging; گام ششم با استفاده از کوئری زیر میتوانیم اطلاعات دو جدول را واکشی کنیم. گام هفتم اکنون میخواهیم با استفاده از دستور Merge اطلاعات دو جدولی که بیش از این ساختیم اطلاعات آنها را مقایسه کنیم در صورت مغایرت اطلاعات لازم درج یا به روز رسانی شود. MERGE sales. category t USING sales. category_staging s ON (s. category_id = t. category_id) WHEN MATCHED THEN UPDATE SET t. category_name = s. category_name, t. amount = s. amount WHEN NOT MATCHED BY TARGET THEN INSERT (category_id, category_name, amount) VALUES (s. category_id, s. category_name, s. amount) WHEN NOT MATCHED BY SOURCE THEN DELETE; توضیحات مربوط به بخش (When Matched) در این قسمت کوئری مربوط به دستور Merge تعداد رکورد و اطلاعات جدول هدف با جدول منبع مورد بررسی قرار میگیرد اگر رکوردهای جدول هدف در جدول منبع وجود داشته باشد اطلاعات آن به روز رسانی خواهد شد. توضیحات مربوط به بخش (When not Matched) در این قسمت کوئری مربوط به دستور Merge تعداد رکورد و اطلاعات جدول هدف با جدول منبع مورد بررسی قرار میگیرد اگر رکوردهای جدول هدف در جدول منبع مغایرت داشته باشد، رکوردهای جدول منبع در جدول هدف اضافه خواهد شد. توضیحات مربوط به دستور WHEN NOT MATCHED BY SOURCE در دستور Merge این ویژگی وجود دارد، که اگر رکوردی در جدول هدف وجود داشته اما در جدول منبع وجود نداشته باشد آن رکورد از جدول هدف حذف شود. گام هشتم بعد از اینکه کوئری مربوط به دستور Merge را انجام دادیم میتوانیم با کوئری زیر اطلاعات هر دو جدول را واکشی کنیم و خواهید دید که نتیجه کوئری Merge اطلاعات دو جدول را یکسان کرده است. SELECT * FROM sales. category; SELECT * FROM sales. category_staging; برای بدست آوردن اطلاعات بیشتر در مورد دیگر دستورات SQL ، به مقاله زیر مراجعه کنید. چه رتبه ای میدهید؟ میانگین ۴.۴ / ۵. از مجموع ۱۲ اولین نفر باش دانلود مقاله آشنایی با دستور Merge در SQL Server فرمت PDF 6 صفحه حجم 1 مگابایت دانلود مقاله معرفی نویسنده مقالات 402 مقاله توسط این نویسنده محصولات 0 دوره توسط این نویسنده تیم فنی نیک آموز معرفی محصول ایمان باقری دوره آموزشی کوئری نویسی در SQL Server 2.190.000 تومان مقالات مرتبط ۰۲ آبان SQL Server ابزار Database Engine Tuning Advisor؛ مزایا، کاربردها و روش استفاده تیم فنی نیک آموز ۱۵ مهر SQL Server معرفی Performance Monitor ابزار مانیتورینگ SQL Server تیم فنی نیک آموز ۱۱ مهر SQL Server راهنمای جامع مانیتورینگ بکاپ ها در SQL Server تیم فنی نیک آموز ۰۸ مهر SQL Server Resource Governor چیست؟ آشنایی با نحوه پیکربندی و اهمیت های آن تیم فنی نیک آموز دیدگاه کاربران لغو پاسخ دیدگاه نام و نام خانوادگی ایمیل ذخیره نام، ایمیل و وبسایت من در مرورگر برای زمانی که دوباره دیدگاهی مینویسم. موبایل برای اطلاع از پاسخ لطفاً مرا با خبر کن ثبت دیدگاه Δ soheib ۳۰ / ۰۳ / ۰۰ - ۰۹:۰۲ با سلام مثل همیشه عالی. ساده، کامل. مرسی پاسخ به دیدگاه soheib ۳۰ / ۰۳ / ۰۰ - ۰۹:۰۲ با سلام مثل همیشه عالی. ساده، کامل. مرسی پاسخ به دیدگاه