الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

التحكم و اتخاذ القرارات في اللغة T-SQL

مغلق
بدأه imadouzoun في 25 مارس 2007 · 0 رد · 2,012 مشاهدة · في قواعد بيانات Microsoft SQL Server
مشاركة: واتساب X فيسبوك تيليجرام
#1

السلام عليكم ورحمة الله وبركاته :

كلمات مفتاحية قبل البدء ..

تعريف كتلة من التعابير A Statement Block BEGIN … END

الخروج من حلقة التكرار While الداخلية BREAK

إعادة تنفيذ حلقة التكرار While CONTINUE

متابعة التنفيذ عند التعليمة التالية للعلامة التي اسمها label GOTO label

لتعريف التنفيذ الشرطي (أي تنفيذ كتلة تعليمات عند تحقق شرط منطقي ما) والتنفيذ الاختياري لكتلة أخرى

عند عدم تحقق الشرط IF … ELSE

الخروج غير المشروط RETURN

انتظار مؤقت للتنفيذ WAITFOR

تنفيذ مجموعة من التعليمات طالما أن شرطاً محدداً ما زال محققاً WHILE تعيد تعبيراً واحداً

من مجموعة من التعابير بناء على شرط مقارنة CASE

مقدمة:

في الكثير من الأحيان نجد أنه من الضروري ألا يتم تنفيذ استعلام ما ضمن إجرائية مخزنة إلا عند تحقق

شرط معين كإدخال معامل بقيمة صحيحة مثلاً. وقد يكون أحد السيناريوهات المحتملة أيضاً الرغبة في عدم تنفيذ استعلام ما لم

يعِد استعلام سابق نتيجة متوقعة. أو أن نحتاج إلى تنفيذ استعلامات مختلفة بحسب قيمة معامل محدد مثلاً .

تحتوي أغلب أنظمة قواعد البيانات العلائقية على نوعين أساسين من التعبيرات الشرطية:

• التعبير IF………..ELSE

• التعبير CASE………….WHEN

كما نحتاج في الكثير من الأحيان إلى تكرار مجموعة من التعليمات بحسب شرط أو شروط معينة.

ويتم ذلك باستخدام التعبير WHILE.

سنقوم فيما يلي باستعراض عمل هذه البنى واختلافات تطبيقها بين قواعد البيانات المختلفة.

1. الحلقة الشرطية IF…ELSE

وتستخدم لتنفيذ كتلة تعليمات بناءً على تحقق شرط منطقي ما.

IF Boolean_expression 
	{ sql_statement | statement_block } 
[ ELSE 
	{ sql_statement | statement_block } ]

ينفذ الجزء ELSE في حال كان الشرط المنطقي Boolean_expression غير محقق (أي يعطي قيمة منطقية FALSE).

وهذا الجزء اختياري وليس بالضرورة موجود.

2. التعليمة CASE

تعيد إحدى القيم الممكنة من مجموعة قيم وذلك بناء على شرط ما.

لهذه التعليمة نمطين:

• النمط البسيط Simple CASE: وفيه تتم مقارنة تعبير ما مع مجموعة من التعابير المحتملة لتحديد النتيجة.

• نمط الاكتشاف Searched CASE: وفيه يتم اختبار مجموعة من الشروط المنطقية لتحديد النتيجة.

يمكن تضمين جزء ELSE في كلا النمطين.

النمط البسيط:

CASE input_expression 
	WHEN when_expression THEN result_expression 
		[ ...n ] 
	[ 
		ELSE else_result_expression 
	] 
END 
نمط الاكتشاف:
CASE
	WHEN Boolean_expression THEN result_expression 
		[ ...n ] 
	[ 
		ELSE else_result_expression 
	] 
END

input_expression :

وهو التعبير المراد مقارنته مع مجموعة القيم الموجودة في النمط البسيط (تعبير المقارنة)

WHEN when_expression :

وهو تعبير بسيط لمقارنة قيمته مع قيمة تعبير المقارنة. نمط هذا التعبير ونمط تعبير المقارنة يجب أن يتطابقا أو أن يكون

هناك تحويل ممكن مضمن بينهما.

THEN result_expression :

وهو ناتج التعليمة في حال طابق تعبير المقارنة التعبير البسيط المحدد في فقرة WHEN الموافقة.

n : للدلالة على أن الجزء WHEN…THEN يمكن أن تتكرر أكثر من مرة.

ELSE else_result_expression :

وهو نتيجة التعليمة في حال كانت قيمة المقارنة مختلفة عن جميع التعابير البسيطة المحددة في الفقرات WHEN السابقة له.

إذا لم يتم تحديد هذا الجزء وكانت قيمة المقارنة مغايرة لجميع الأنماط البسيطة المحددة فإن ناتج التعليمة هو NULL.

يتم تطبيق التراكيب IF…ELSE و CASE…WHEN في Oracle و DB2 و MySQL بصورة مشابهة لتلك المستخدمة في

SQL Server مع الانتباه إلى الاختلافات التالية:

• في Oracle وDB2 و MySQL يمكنك استخدام ELSE…IF في التركيب IF…ELSE لتقييم شروط إضافية.

• في Oracle و DB2 و MySQL يمكن لـ CASE…WHEN أن تستخدم بصورة منفصلة

وليست بحاجة لأن تكون جزءاً من عبارة تعيين قيمة لمتغير أو جزءاً من عبارة

SELECT كما هي الحال في SQL Server.

• يتم إغلاق التركيب CASE…WHEN بالتعبير END CASE وليس END كما هي الحال في SQL Server.

• بالطبع لن نغفل الاختلافات المذكورة مسبقاً كضرورة تحويل إشارات المساواة إلى إشارات := في Oracle

عوضاً عن استخدام SET.

3. حلقة التكرار WHILE

وتستخدم لتنفيذ تعليمة SQL أو كتلة تعليمات طالما أن شرطاً منطقياً مازال محققاً.

دعم قواعد البيانات تعبيرات مختلفة لتأمين تنفيذ كتلة من التعليمات لأكثر من مرة اعتماداً على استمرار تحقق شرط ما.

• ففي SQL Server يستخدم التعبير WHILE مع BEGIN وEND.

• أما في Oracle فيُستخدم لتحديد بداية جسم الحلقة التعبير LOOP ولنهايتها END LOOP.

• وفي DB2 نستخدم التعبير DO لتحديد جسم الحلقة، والتعبير END WHILE لتحديد نهايتها.

• وفي MySQL يُحدد جسم الحلقة بالتعبير WHILE ونهايتها بالتعبير END WHILE.

WHILE Boolean_expression :

{ sql_statement | statement_block }

[ BREAK ]

{ sql_statement | statement_block }

[ CONTINUE ]

Boolean_expression:

وهو تعبير منطقي (أي يعيد إما صح أو خطأ). يمكن للتعبير المنطقي أن يحوي تعليمة Select وفي هذه الحالة يجب

وضع تعليمة الانتقاء بين أقواس.

{ sql_statement | statement_block }

ويمكن أن تتضمن أي تعليمة SQL أو كتلة تعليمات SQL.

كتلة تعليمات هي مجموعة من التعليمات الموضوعة بين BEGIN و END.

BREAK:

وتؤدي إلى الخروج من تعليمة WHILE الداخلية (في حالة وجود أكثر من حلقة WHILE منسوجة ضمن بعضها البعض).

الكلمة المفتاحية END تحدد نهاية الحلقة.

CONTINUE:

وتؤدي إلى العودة إلى بداية الحلقة مجدداً وإهمال كافة التعليمات اللاحقة لها.

4. التعليمة WAITFOR

وتستخدم لإيقاف تنفيذ التعليمة التالية له مدة محددة من الزمن أو بدء التنفيذ في زمن محدد.

WAITFOR { DELAY 'time' | TIME 'time' }

DELAY : تنفيذ التعليمة التالية بعد مرور الزمن المحدد بالقيمة time (هذا المتحول يجب أن يكون من النمط DateTime).

TIME : تنفيذ التعليمة التالية بحلول التوقيت المحدد بالقيمة time ( وهو متحول يجب أن يكون من النمط DateTime).

5. أمثلة

مثال 1:

يقوم المثال التالي بتحديد كون وسطي أسعار الكتب أكبر أو أصغر من 15$

USE pubs
IF 
	(SELECT AVG(price) FROM titles ) < $15
BEGIN
	PRINT 'Average title price is less than $15.'
	PRINT 'Another Statement in the Block '
END
ELSE
	PRINT 'Average title price is more than $15.'

مثال 2:

نعيد نفس المثال السابق لكن مع الحالات أكبر من، أصغر من، ويساوي 15$.

IF (SELECT AVG(price) FROM titles ) < $15
	PRINT 'Average title price is less than $15.'
ELSE
	IF (SELECT AVG(price) FROM titles ) > $15
   		PRINT 'Average title price is more than $15.'
	ELSE
		PRINT 'Average title price is equal to $15.'

مثال 3:

نريد طباعة بيانات عن الكتب بحسب مجالات السعر: أصغر من 10، بين 10 و 20، وأكبر من $20 مع رسالة

توضيحية تبين مجال السعر.

Use Pubs
Go
Declare @msg VarChar(50)
If (Select Count(*) From Titles Where Price<10) >0
Begin
	Set @msg = 'There are several books with prices less than $10. These Books are:'
	Print @msg
	Select title From titles where price<10
End

If (Select Count(*) From Titles Where Price Between 10 and 20) >0
Begin
	Set @msg = 'There are several books with bearable prices. These Books are:'
	Print @msg
	Select title From titles Where price between 10 and 20
End
Else
Begin
	Set @msg = 'Many books are very expensive. These Books are:'
	Print @msg
	Select title From titles Where price > 20
End

مثال 4:

نريد أن نضاعف أسعار جميع الكتب طالما أن وسطي السعر أقل من $30 وأعلى سعر لا يتجاوز$50.

USE pubs
GO
WHILE (SELECT AVG(price) FROM titles) < $30
BEGIN
	UPDATE titles
	SET price = price * 2
	SELECT MAX(price) FROM titles
	IF (SELECT MAX(price) FROM titles) > $50
		BREAK
	ELSE
		CONTINUE
END

مثال 5

يظهر المثال التالي كيفية استخدام تعليمة case من أجل تعديل القيمة الراجعة من حقل. تظهر التعليمة صنف،

عنوان، سعر الكتب، مع وسطي السعر للكتب حسب النوع ومجموع سعر كل نوع من أنواع الكتب.

USE pubs
GO
SELECT   Category = 
	CASE type
		WHEN 'popular_comp' THEN 'Popular Computing'
		WHEN 'mod_cook' THEN 'Modern Cooking'
		WHEN 'business' THEN 'Business'
		WHEN 'psychology' THEN 'Psychology'
		WHEN 'trad_cook' THEN 'Traditional Cooking'
		ELSE 'Not yet categorized'
	END,
	CAST(title AS varchar(25)) AS 'Shortened Title', price AS Price
FROM titles
WHERE price IS NOT NULL
ORDER BY type
COMPUTE AVG(price) BY type
COMPUTE SUM(price) BY type
Category			Shortened Title		   Price				 
------------------- ------------------------- --------------------- 
Business			The Busy Executive's Data 19.9900
Business			Cooking with Computers: S 11.9500
Business			You Can Combat Computer S 2.9900
Business			Straight Talk About Compu 19.9900

											  avg
											  =====================
											  13.7300


											  sum
											  =====================
											  54.9200


Category			Shortened Title		   Price				 
------------------- ------------------------- --------------------- 
Modern Cooking	  Silicon Valley Gastronomi 19.9900
Modern Cooking	  The Gourmet Microwave	 2.9900

											  avg
											  =====================
											  11.4900


											  sum
											  =====================
											  22.9800


Category			Shortened Title		   Price				 
------------------- ------------------------- --------------------- 
Popular Computing   But Is It User Friendly?  22.9500
Popular Computing   Secrets of Silicon Valley 20.0000

											  avg
											  =====================
											  21.4750


											  sum
											  =====================
											  42.9500


Category			Shortened Title		   Price				 
------------------- ------------------------- --------------------- 
Psychology		  Computer Phobic AND Non-P 21.5900
Psychology		  Is Anger the Enemy?	   10.9500
Psychology		  Life Without Fear		 7.0000
Psychology		  Prolonged Data Deprivatio 19.9900
Psychology		  Emotional Security: A New 7.9900

											  avg
											  =====================
											  13.5040


											  sum
											  =====================
											  67.5200


Category			Shortened Title		   Price				 
------------------- ------------------------- --------------------- 
Traditional Cooking Onions, Leeks, and Garlic 20.9500
Traditional Cooking Fifty Years in Buckingham 11.9500
Traditional Cooking Sushi, Anyone?			14.9900

											  avg
											  =====================
											  15.9633


											  sum
											  =====================
											  47.8900


(26 row(s) affected)

مثال 6

يمكننا نمط الاستكشاف لتعليمة case من استبدال قيم حقل في النتيجة النهائية.

اكتب تعليمة استعلام عنوان الكتاب، تعيد من أجل كل كتاب "very Reasonable" إذا كان سعر الكتاب أقل من عشرة، "Coffee

Table Title" إذا كان سعر الكتاب بين 10 و 20 ( أصغر تماماً من 20) ، "not yet priced" إذا كان السعر null.

و إلا تعيد "Expensive Book".

USE pubs
GO
SELECT	'Price Category' = 
	  CASE 
		 WHEN price IS NULL THEN 'Not yet priced'
		 WHEN price < 10 THEN 'Very Reasonable Title'
		 WHEN price >= 10 and price < 20 THEN 'Coffee Table Title'
		 ELSE 'Expensive book!'
	  END,
   CAST(title AS varchar(20)) AS 'Shortened Title'
FROM titles
ORDER BY price

مثال 7

تقوم التعليمة التالية بإيقاف التنفيذ لمدة ثانيتين ثم تقوم بعرض قائمة بأرقام الموظفين في قاعدة البيانات Northwind.

WAITFOR DELAY '00:00:02'

SELECT EmployeeID FROM Northwind.dbo.Employees

مثال 8

عند الساعة العاشرة والنصف و59 ثانية ليلاً أنشئ تقريراً بأرقام وأسماء الموظفين من قاعدة البيانات Northwind.

USE northwind
go
BEGIN
	WAITFOR TIME '22:30:59'
	SELECT 
		employeeId,
		firstName +  ' '  + lastname as ' full name'
	FROM 
		employees
	ORDER BY employeeid
END

المراجع : منهاج الجامعة الافتراضية السورية ..

تم تعديل هذه المشاركة بواسطة imadouzoun في 25 مارس 2007 في 17:54

دروس و كتب مفيدة----------------------كتيب الإجرائيات المخزنةتعرف على اللغة Transact SQL <<-->> كتيب عن تنصيب قواعد البيانات Sql Server باللغة العربية كتيب عن إنشاء قواعد البيانات في SQL Server باللغة العربية <<-->> درس مع الأمثلة عن المؤشرات و التعامل معها في الـ T-SQLالعبارات الشرطية و الحلقات في T-SQL <<-->> شرح لبعض الـ Extended Stored Procedure استخدام مكتبات الـ Dot Net الخاصة بك في الـ Sql Server 2005 <<-->> التعامل مع المصفوفات من خلال الـ T-SQLتعابير الجداول الشائعة في SQL Server 2005 <<-->>الاتصال بالأداة SQL Server Management Studioحلول سريعة و لمحات برمجية --------------------------------التصدير إلى إكسل : طريقة أولى : طريقة بسطر واحد من الكود <<-->> طريقة ثانية : طريقة تحتاج إنشاء إجرائية مخزنةً تجهيز بيانات جدول بالصيغة XML تمهيداً لحفظها كملف <<-->> تصدير البيانات إلى ملفات نصية برمجياً إغلاق جميع الإتصالات المفتوحة بقاعدة بيانات محددة .. تمهيداً لاسترجاعها أو حذفها <<-->> الاستعلام بناء على وقت مخزن بالصيغة العربية ضمن حقل نصي ..حذف السجلات المتكررة و إبقاء عدد محدد منها في جدول.. <<-->> أسرع طريقة لحذف سجلات جدول كيف احصل على اسم جهازي والباسوورد باستخدام T-SQL <<-->> حشر أنواع الصور المختلفة في حقل من نوع Image باستخدام إجرائية مخزنة .كيف تعرف أنواع الصور المخزنة في حقل من نوع Image .. <<-->> إجرائيات مخزنة ببارامترات ديناميكية مفيدة جداً للاستعلامات استخدام رقم الحقل بدلاً من الإسم في عبارات الإستعلام <<-->> من هو أضخم الجداول في قاعدة بياناتي ؟معرفة زمن تنفيذ الإجرائيات ( لتختار الطريقة الأسرع بين إجرائياتك المخزنة ) <<-->> التعامل مع الـ Rules برمجياً الحصول على آخر صف في الجدول <<-->> قراءة ملفات XML باستخدام T-SQL برمجياً (مثال مرفق)سحب بيانات ملف إكسل إلى الـ SQL Server <<-->> تشفير النسخة الاحتياطية بكلمة مرور <<-->> التخلص من البيانات المكررة <<-->> حل مشكلة التاريخ الهجريDifferential Backup بالتعريف---------- لا إله إلا الله .. محمد رسول الله

أخوكم في الله..  Imad Ozone

هذا الموضوع مغلق.

مواضيع مشابهة