محمدصالح قاسمی
محمدصالح قاسمی
خواندن ۴ دقیقه·۱ سال پیش

چالش‌ها و راه‌حل‌های انتقال اطلاعات بین دو دیتابیس با تفاوت‌های ساختاری در SQL Server با استفاده از دستورات T-SQL

در این مقاله، روشی برای انتقال داده‌ها بین دو دیتابیس در SQL Server با استفاده از دستورات T-SQL بررسی شده است. دو دیتابیس مورد مطالعه از نظر ساختاری تفاوت‌هایی دارند، اما با استفاده از توانمندی‌های T-SQL و ارتباط موثر بین جداول، این انتقال داده‌ها به یک صورت یکپارچه و کارآمد انجام می‌شود. در اینجا، جزئیات نحوه اجرای این روش و اهمیت آن برای بهبود کارایی و مدیریت داده‌ها مورد بررسی قرار گرفته‌اند. این مقاله با هدف راهنمایی برای افرادی که با دیتابیس‌های هتروژن و انتقال داده‌ها در SQL Server سر و کار دارند، ارائه شده است.

دیتابیس های هتروژن ، پایگاه‌هایی هستند که از داده‌هایی از منابع متعدد و غیر مشابه تشکیل شده‌اند. این منابع ممکن است شامل انواع مختلفی از پایگاه های داده مانند پایگاه های داده رابطه ای، پایگاه های داده NoSQL و فایل های مسطح و همچنین پلتفرم ها و سیستم عامل های مختلف باشد.

اینجا یک الگوی کلی برای کپی کردن داده از یک جدول به جدول دیگر است:

INSERT INTO دیتابیس مقصد.نام جدول مقصد (لیست ستون‌ها) SELECT لیست ستون‌ها FROM دیتابیس منبع.نام جدول منبع WHERE شرط انتخاب

مثال: ما میخواهیم اطلاعات یک دیتابیس فروشگاهی را به دیتابیس دیگر انتقال دهیم .

برای انتقال اطلاعات کاربران یک دیتابیس به دیتابیس دیگر

اطلاعاتی میخواهیم انتقال دهید

  • Id
  • FullName
  • PhoneNumber
  • IsDeleted
  • BirthDay
  • IssuedDateTime

این اطاعات نیز در دیتابیس دوم ما وجود دارد نکته که باید رعایت کرد این است که باید نوع داده ها در دو دیتابیس باهم یکی باشند.

INSERT INTO DatabaseDestination.dbo.DestinationTable (ID, FullName, PhoneNumber,IsDeleted,BirthDay,IssuedDateTime) SELECT ID, FullName, PhoneNumber,IsDeleted,BirthDay,IssuedDateTim FROM DatabaseSource.dbo.SourceTable

چالش اول : در دیتابیس اول ما شماره تلفن های تکراری ثبت شده است و ما نمیخواهیم در دیتابیس دوم ما این شماره تلفن ها ثبت شود با یه عبارتی فیلد PhoneNumber ما Uniqueاست.

INSERT INTO DatabaseDestination.dbo.Customer (ID, FullName, PhoneNumber,IsDeleted,BirthDay,IssuedDateTime) SELECT ID, FullName, PhoneNumber,IsDeleted,BirthDay,IssuedDateTim FROM DatabaseSource.dbo.User AS SOURCE WHERE PhoneNumber NOT EXISTS(SELECT 1 FROM DatabaseDestination.dbo.Customer AS DESTINATION WHERE DESTINATION.PhoneNumber = SOURCE.PhoneNumber)

در این کوئری، تنها ردیف‌هایی انتخاب می‌شوند که نامشان در جدول مقصد وجود نداشته باشد.

در دستور SQL، برچسب‌های AS به شما این امکان را می‌دهند که یک نام جایگزین (یا علامت) برای یک جدول یا ستون تعیین کنید. این موارد اختیاری هستند و برای خوانایی کوئری و همچنین برای ایجاد نامهای جدید برای ستون‌ها یا جدول‌ها استفاده می‌شوند.

چالش دوم : ما در دیتابیس دوم میخواهیم فقط شماره تلفن هایی ذخیره شوند که با "0930" شروع شده

باشند:

INSERT INTO DatabaseDestination.dbo.Customer (ID, FullName, PhoneNumber,IsDeleted,BirthDay,IssuedDateTime) SELECT ID, FullName, PhoneNumber,IsDeleted,BirthDay,IssuedDateTim FROM DatabaseSource.dbo.User AS SOURCE WHERE PhoneNumber LIKE '0930%' AND NOT EXISTS(SELECT 1 FROM DatabaseDestination.dbo.Customer AS DESTINATION WHERE DESTINATION.PhoneNumber = SOURCE.PhoneNumber)

خب چالش بعدی انتقال اطلاعات سفارش ها است.

ما در انتقال کاربران فقط آنهایی را انتقال دادیم که شماره تلفن آنها با "0930" شروع شده باشند پس کاربرانی را داریم که شماره تلفن آنها متفاوت است پس با کوِئری بالا نمیتوان اطلاعات سفارشات را انتقال داد چون جدول سفارشات با جدول مشتری ها ارتباط دارن و خطای FOREIGN KEY میدهد.

پس ما باید فقط اطلاعات سفارش هایی را ثبت کنیم که کاربران آنها در دیتابیس دوم ما وجود دارد.

USE DatabaseDestination Insert IntoDatabaseDestination.dbo.Orders (DeliveryType,TotalPrice,TotalDiscount,PaymentMethod,IssuedDateTime,CustomerId) select DeliveryTypeId,TotalPrice,TotalDiscount,PaymentMethod,IssuedDateTime,CustomerId from DatabaseSource.dbo.Orders as source where CustomerId in (select CustomerId from Customer where Id = source.CustomerId)

خب در قدم بعدی باید آیتم های سفارشات کاربر را انتقال دهیم :

همان طور که در چالش بالا با آن برخورد کردیم ما همه کاربران و سفارشات را انتقال ندادیم پس در انتقال آیتم های سفارشات باید آنهایی را انتقال دهیم که سفارشات آنها در دیتابیس دوم ما ثبت شده باشد.

insert into DatabaseDestination.dbo.OrderItems (OrderId,ProductId,Quantity,Price) select OrderId,ProductId,Count,Price from DatabaseSource.dbo.OrderItems where OrderId in (select OrderId from Orders as source where OrderItems.OrderId = source.Id)

در این مقاله، به بررسی روش‌های انتقال داده‌ها بین دو دیتابیس متفاوت در SQL Server با استفاده از دستورات T-SQL پرداختیم. که با توجه به تفاوت‌های ساختاری دیتابیس‌ها، میتوان با استفاده از توانمندی‌های T-SQL و ارتباط موثر بین جداول، انتقال داده‌ها را به نحوی یکپارچه و کارآمد انجام داد.

در انتقال داده‌ها، با رعایت مسائلی نظیر ایجاد Unique شماره تلفن‌ها در دیتابیس مقصد و استفاده از شیوه‌هایی برای حفظ اطلاعات یکپارچه، همچنین، با آوردن نمونه کوئری‌ها و توضیح جزئیات اجرایی، شما قادر به اجرای عملی این انتقالات خواهید بود.

در کل، این مقاله به عنوان یک راهنمای کامل برای افرادی که با دیتابیس‌ها و انتقال داده‌ها در SQL Server سر و کار دارند، ارائه شده است. امیدوارم که این راهنما، افراد را در بهبود کارایی و مدیریت داده‌ها در پروژه‌های مختلف یاری کند.

sql serveraspnetcoresoftware engineeringدیتابیس
شاید از این پست‌ها خوشتان بیاید