كيفية تنفيذ عملية Upsert
في SQL Server: دمج عمليات الإدراج والتحديث
عند العمل مع قواعد البيانات، غالبًا ما نواجه مواقف تحتاج فيها إلى إدارة سجلات قد تكون موجودة أو لا. هنا يأتي مفهوم Upsert
في الصورة، مما يسمح لنا بدمج عمليات INSERT و UPDATE بسلاسة. في هذا المنشور، سنستكشف تحديًا شائعًا في SQL Server وسنقدم لك حلاً ينفذ منطق Upsert بشكل فعال.
المشكلة: إدارة تكليفات الوظائف
تخيل أنك تمتلك عرضًا يسرد تكليفات الوظائف، حيث يظهر من هو مكلف بكل وظيفة ومرحلته الحالية. هدفك هو إنشاء إجراء مخزن يعيد عدداً من الوظائف لكل موظف في مراحل مختلفة.
تشمل المحاولة الأولية إدراج العد في جدول مؤقت. ومع ذلك، تظهر مشكلة رئيسية عندما تجد أن الموظفين الذين لديهم وظائف في أكثر من مرحلة ينتجون صفوفًا منفصلة في جدول النتائج. بدلاً من ذلك، تحتاج إلى وسيلة إما لتحديث صف موجود لموظف أو إدراج صف جديد إذا لم يكن موجودًا.
إليك مثال مبسط للشفرة التي بدأت بها:
DECLARE @ResultTable table
(
StaffName nvarchar(100),
Stage1Count int,
Stage2Count int
)
INSERT INTO @ResultTable (StaffName, Stage1Count)
SELECT StaffName, COUNT(*) FROM ViewJob
WHERE InStage1 = 1
GROUP BY StaffName
INSERT INTO @ResultTable (StaffName, Stage2Count)
SELECT StaffName, COUNT(*) FROM ViewJob
WHERE InStage2 = 1
GROUP BY StaffName
في هذه الشفرة، يظهر موظف لديه وظائف في كلا المرحلتين مرتين في @ResultTable
، وهو ما ليس هو النتيجة المرغوبة.
الحل: تنفيذ عملية Upsert
للتعامل مع هذه المشكلة، نحتاج إلى تنفيذ نهج Upsert يجمع بين إدراج وتحديث السجلات داخل @ResultTable
. إليك تحليل خطوة بخطوة لكيفية القيام بذلك:
الخطوة 1: تهيئة جدول النتائج مع جميع الموظفين
ابدأ بإدراج جميع الموظفين في جدول النتائج الخاص بك مع تعيين العد الابتدائي على الصفر. يضمن هذا تمثيل كل موظف في الجدول.
INSERT INTO @ResultTable (StaffName, Stage1Count, Stage2Count)
SELECT StaffName, 0, 0 FROM ViewJob
GROUP BY StaffName
الخطوة 2: تحديث عدود المراحل
بعد ذلك، نحتاج إلى تحديث العدود لكل مرحلة. نفذ الأوامر SQL التالية، التي تستخدم عبارة UPDATE
لتعيين القيم بناءً على عدود الوظائف من العرض الخاص بك:
تحديث عد المرحلة 1
UPDATE @ResultTable
SET Stage1Count = (
SELECT COUNT(*) FROM ViewJob
WHERE InStage1 = 1 AND @ResultTable.StaffName = StaffName
)
تحديث عد المرحلة 2
UPDATE @ResultTable
SET Stage2Count = (
SELECT COUNT(*) FROM ViewJob
WHERE InStage2 = 1 AND @ResultTable.StaffName = StaffName
)
الخاتمة
باتباع هذه الخطوات، تحقق عملية Upsert فعالة في SQL Server دون الحاجة إلى اللجوء إلى المؤشرات أو التكرارات المعقدة. تمكنك هذه الطريقة من إدارة وصيانة عدود الوظائف بدقة لكل موظف عبر مراحل مختلفة في قاعدة بياناتك.
أفكار أخيرة
استخدام منهجية Upsert لا يعزز فقط كفاءة استعلامات SQL الخاصة بك، بل يبسط أيضًا جهود إدارة قاعدة البيانات الخاصة بك. ستمكن التمثيل الواضح لتكليفات الموظفين من تحسين تحليل البيانات ونتائج التقارير بشكل كبير.
إذا كان لديك أي أسئلة أو تحتاج إلى مزيد من المساعدة مع استعلامات SQL الخاصة بك، فلا تتردد في طرحها في التعليقات أدناه!