الجزء
السابع: أسترجاع اخر قيمة
للعمود المتماثل
Getting last generated identity column value
هذا الجزء مكمل للجزء السادس,
تعلمنا في الجزء السادس ان العمود المتماثل Identity Column تنتج قيمته بصورة تلقائية, ولكن ماذا لو أردنا استرجاع اخر قيمة
للعمود المتماثل, في هذا الجزء سوف تتعلم ثلاث طرق لأسترجاع أخر قيمة تم انشاءها
في العمود المتماثل Identity Column :
عن طريق ثلاث جمل استعلام التالية:
SELECT SCOPE_IDENTITY()
SELECT @@IDENTITY
SELECT IDENT_CURRENT('TABLE_NAME')
السؤال التالي: لماذا يوجد ثلاث جمل لعمل نفس الغرض؟؟؟!
الجواب: عندما تقوم بأنشاء اتصال بقاعدة البيانات فأنك بهذه
الحالة تفتح حلقة اتصال تسمى بالSession واذا قام شخص اخر بالأتصال بنفس القاعدة
سينشأ حلقة اتصال ثانية Session خاصة به, اي اصبح حلقتين اتصال, والمجال او
النطاق Scope خاص بكل حلقة اتصال, هام جداً ان تكون قد عرفت
الفرق بين الSession والScope لأنها على
غرارها ستعرف اين تستخدم احد الجمل في المكان المناسب,
للتوضيح أفضل سأقوم بأنشاء جدولين tblTest1 & tblTest2 وكلاهما يحتويان على عامودين العمود الأول المعرف ID والذي سيكون
هو العمود المتماثل والعمود الثاني سيكون قيمة عشوائية فقط لغرض توضيح الفكرة:
CREATE TABLE tblTest1
(
ID INT NOT NULL PRIMARY KEY IDENTITY(1,1),
Value NVARCHAR(30) NOT NULL
)
CREATE TABLE tblTest2
(
ID INT NOT NULL PRIMARY KEY IDENTITY(1,1),
Value NVARCHAR(30) NOT NULL
)
والأن لنعرف بالصورة ماذا يقصد بالSession والScope ؟
1. عمل ال SELECT SCOPE_IDENTITY()
تستخدم هذه الدالة لأسترجاع اخر قيمة للعمود المتماثل identity column ضمن نفس حلقة الأتصال Session وضمن نفس النطاق Scope :
مثال على ذلك سأقوم بأنشاء سجل جديد في جدول tblTest1 وسأسترجع اخر قيمة للعمود المتماثل عن طريق تلك الدالة:
تستخدم هذه الدالة لأسترجاع اخر قيمة للعمود المتماثل identity column ضمن نفس حلقة الأتصال Session وضمن نفس النطاق Scope :
مثال على ذلك سأقوم بأنشاء سجل جديد في جدول tblTest1 وسأسترجع اخر قيمة للعمود المتماثل عن طريق تلك الدالة:
2. عمل ال SELECT @@IDENTITY
يستخدم هذا المتغير لأسترجاع اخر قيمة للعمود المتماثل identity column ضمن نفس حلقة الأتصال Session ولكن ضمن نطاق Scopeاخر:
مثال على ذلك سأقوم بأنشاء سجل جديد في جدول tblTest1 وسأنشأ زناد Trigger يقوم بالعمل عندما ينشأ سجل جديد في جدول tblTest1 وفي هذا الزناد سأنشأ سجل اخر في جدول tblTest2 والأحظ الفرق بين اول جملة استعلام مع هذه الجملة:
يستخدم هذا المتغير لأسترجاع اخر قيمة للعمود المتماثل identity column ضمن نفس حلقة الأتصال Session ولكن ضمن نطاق Scopeاخر:
مثال على ذلك سأقوم بأنشاء سجل جديد في جدول tblTest1 وسأنشأ زناد Trigger يقوم بالعمل عندما ينشأ سجل جديد في جدول tblTest1 وفي هذا الزناد سأنشأ سجل اخر في جدول tblTest2 والأحظ الفرق بين اول جملة استعلام مع هذه الجملة:
CREATE TRIGGER TR_forInsert on tblTest1
for insert
as
Begin
INSERT INTO tblTest2 VALUES('M')
end
توضحت الفكرة من الصورة اعلاه ان
الSCOPE_IDENTITY تسترجع اخر قيمة للعمود المتماثل لنفس الSession ونفس المجال Scope بينما المتغيير @@IDENTITY يسترجع اخر
قيمة للعمود المتماثل لنفس الSession
ولكن لScope اخر , لاحظ ان الScope تغير عندما انشأنا زناد Trigger لأنه يعمل
بمجال اخر بنفس الSession
3. عمل ال SELECT IDENT_CURRENT('TABLE_NAME')
هذه الدالة تسترجع لك اخر قيمة للعمود المتماثل للجدول المذكور في اي Session وفي اي Scope لاحظ المثال التالي:
هذه الدالة تسترجع لك اخر قيمة للعمود المتماثل للجدول المذكور في اي Session وفي اي Scope لاحظ المثال التالي:
في الSession 2 انشأت سجل
جديل في جدول tblTest1 وهذا ضغط على زناد Trigger لأنشاء سجل
في جدول tblTest2 لاحظ في الSession 1 في المخرجات
الSCOPE_IDENTITY() استرجعت اخر قيمة ضمن نفس الSession اي الSession 1 =10 وفي
المتغيير @@IDENTITY = 6 اخر قيمة للIdentity column ضمن نفس الSession ولكن بنطاق اخر Scope , اخر شيء IDENTIT_CURRENT() استرجعت اخر قيمة للجدول المذكور في اي Session وفي اي Scope =11
هنا السؤال الأهم اذا كان لديك
موقع اي من هذه الجمل سوف تستخدم لأسترجاع اخر قيمة عندما يقوم شخص بالتسجيل في
موقعك؟؟!
اريد الجواب منكم في تعليق J
SCOPE_IDENTITY()
ReplyDelete