تنفيذ أوامر الـ SQL بطريقة ديناميكية في الـ SQL Server

12 يوليه 2017     653 مشاهدة    1 تعليق
تم النشر في #SQL Server 

كما هو من المعلوم أن أوامر الـ SQL تتيح لنا التعامل مع خوادم البيانات وتمكننا من إسترجاع البيانات ومعالجتها في الخادم. وقد نحتاج في تطبيقاتنا أن يكون الأمر المراد تنفيذه غير ثابت, بمعنى أنه قد يحتاج إلى بعض المتغيرات الذي يتم إسناد قيمها في وقت التنفيذ, ومثال على هذا الـ SQL Parameters.

فهنالك العديد من السيناريوهات التي قد نحتاج فيها بناء أمر الـ SQL في وقت التنفيذ On Fly فعلى سبيل المثال لو أحتجنا تحديد إسم الجدول في وقت التنفيذ, أو تركيب الأمر ككل في وقت التنفيذ. فالسؤال كيف يمكننا عمل هذا؟!!

لنتمعن جيداً في السيناريوهات الذي تم الإشاره إليها أعلاه, فالـ SQL Server أتاحت لنا بعض الطرق التي تمكنا من تنفيذ أوامر الـ SQL بطريقه ديناميكيه, فيمكننا إستخدام الأوامر التاليه:

1- EXEC

يمكننا الأمر EXEC من تفيذ أمر الـ SQL من جملة نصية تحتوي على الأمر المراد تنفيذه.

لنلقي نظرة على الشيفرة التاليه: 

declare @str varchar(max)='', @param1 varchar(50)='', @param2 varchar(50)=''

set @param1='1'
set @param2='2'
set @str='Select * From Products Where CategoryId In ('+@param1+','+@param2+')'

Exec(@str)

فقد تم تعريف 3 متغيرات الأول يحتوي على الجملة المراد تنفيذها والمتغيرين الآخرين تم إستخدامهما كمتغيرين يتم الإستفاده منهما في جملة الـ Where, وبعدها تم تنفيذ الأمر بإستخدام الــ EXEC على الجملة النصية التي تم تركيبها من المتغيرات المعرفه مسبقاً.

وبعد التنفيذ سوف يتم ترجمة الشيفرة السابقة للإستعلام للتالي:

Select * From Products Where CategoryId In (1,2)

2- sp_executesql

يمكننا الأمر sp_executesql من تنفيذ أمر SQL في وقت التشغيل, وهو شبيه بالأمر السابق, إلا أنه يمكننا من إضافة متغيرات للأمر ليتم الإستفاده منها في تركيب الأمر المراد تنفيذه.

لنلقي نظرة على الشيفرة التاليه:

declare @param1 int, @param2 int

set @param1=1
set @param2=2

exec sp_executesql N'Select * From Products Where CategoryId In (@1,@2)' ,N'@1 int, @2 int',@param1, @param2

نفس الشيء سيتم ترجمة الإستعلام للتالي:

Select * From Products Where CategoryId In (1,2)

طبعاً إستخدام الـ sp_executesql قد يكون أفضل بكثير نوعاً ما من إستخدام الأمر EXEC لسببين, أولاً يعتبر أكثر أماناً وحماية خصوصاً في الـ SQL Injection, ثانياً الإستعلام بإستخدام الـ sp_executesql يحسن من الأداء وذلك لإن الإستعلام يبنى في المره الأولى ومن ثم يتم إرجاعه من الـ Cache.

فأعتقد الآن يمكنك تنفيذ أوامر SQL ديناميكية بطريقه سهله جداً بعد التعرف على الأمرين السابقين.

تويتر فيسبوك قوقل + لينكد إن


1 تعليق

طارق طه (12/07/2017 07:44:39 ص)

تشكر بش مهندس مقال اكثر من رائع ومفيد


اكتب تعليقك