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

المؤشرات في ال Sql Server

بدأه imadouzoun في 2 أكتوبر 2006 · 11 رد · 9,613 مشاهدة · في قواعد بيانات Microsoft SQL Server
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

المؤشرات في الـ Sql Server

________________________________

بسم الله الرحمن الرحيم :

سنبدأ اليوم بإذن الله دروس عن المؤشرات في الـ T-SQL اللغة البرمجية في الـ Sql Server .

ولكن بداية دعوني أمهّد للموضوع :

فما هي المؤشرات و ما تفيدنا كمبرمجين في قواعد البيانات Sql Server ؟؟

هذه المؤشرات هي عبارة عن Record Set مجموعة سجلات شبيهه بتلك التي نستخدمها بالـ VBA ..

والتي من خلالها نقوم بالتنقل خلال السجلات ( التالي و السابق و الأول و الأخير ) ..

ربما ستسأل نفسك ما الفائدة من هذه المؤشرات طالما أن الاستعلامات تقدم لي كل ما أحتاج ..؟؟؟

سأجيبك بالقول إن الاستعلامات لها أوجه قصور في بعض النواحي و ستتضح لديك هذه الأوجه في

الأمثلة التي سنسردها ... فلا تبدأ بالتململ لأن الدرس سيكون بمعلوماته رائع و مفيد جداً جداً لمن لا

يعرف ما هي المؤشرات ..

المؤشرات تسمح لك بالمرور على كل سجل من مجموعة سجلات المؤشر و تنجز عليه العمليات التي تحتاجها ..

كأن تجلب لكل فاتورة تفاصيلها (التي هي عبارة عن مجموعة من سجلات جدول آخر) ..

ولكن كيف سنعرف مؤشر جديد أو بالأحرى كيف أبدأ ببرمجة مؤشر و التعامل معه .. ؟

باختصار أقول لك الأمثلة سترويك تماماً :::::

عليك أولاً :

1- أن تصرح عن مؤشر .

2- تفتح المؤشر .

3- جلب سجلات . ( التالي , السابق , الأول , الأخير , السجلات (n) بعد السجل الحالي ,

السجل ذو الترتيب (n) ) ..

4- إغلاق المؤشر .

5 - إزالة المؤشر من الذاكرة .

للمؤشر صيغتان : قياسية (SQL-92) .. و الأخرى التي تستخدم كامل توسعات اللغة T-SQL .

التصريح عن المؤشر :

الصيغة القواعدية للمؤشر من النوع القياسي :

DECLARE cursor_name [ INSENSITIVE ] [ SCROLL ] CURSOR 
FOR select_statement 
[ FOR { READ ONLY | UPDATE [ OF column_name [ ,...n ] ] } ]

الصيغة الموسعة للمؤشر ( التي سنفصلها لاحقاً بإذن الله ) كالتالي :

DECLARE cursor_name CURSOR 
[ LOCAL | GLOBAL ] 
[ FORWARD_ONLY | SCROLL ] 
[ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ] 
[ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ] 
[ TYPE_WARNING ] 
FOR select_statement 
[ FOR UPDATE [ OF column_name [ ,...n ] ] ]

ما أرجوه منك الآن هو ألا تخاف من هذا الكود لأنك ستجد كم هو سهل بعد أن تقرأ الشروحات التالية ..

سأبدأ بالصيغة القياسية :

Declare :

و هي تستخدم للتصريح عن متحولات كما تعلم ..

cursor_name :

و هو اسم اختياري يضعه المبرمج للمؤشر للإشارة إليه ضمن الكود ,

و عليك أن تنتبه أخي الكريم إلى ن هذا الاسم يتبع لقوانين تسمية المتحولات في الـ T-SQL ..

INSENSITIVE :

1.تجعل المؤشر للقراءة فقط أي غير قابل لاستخدام العبارة Where Current Of

معه في عبارات الحذف و التعديل ..

( أما عن هذه العبارة فلا تكن عجولاً و لا تحرق المراحل ستعرف لاحقاً ما المقصود منها )

ولكن لماذا ؟

الإجابة : لأنها تنشئ نسخة مؤقتة من بيانات المؤشر ليستخدمها المؤشر ..

أي أن بيانات المؤشر قد لا تكون بالضرورة نفس بيانات المصدر عند استخدام العبارة

(INSENSITIVE) في تصريح المؤشر من النوع القياسي ..

و بالتالي ستتوصل إلى نتيجة بسيطة ( في هذه الحالة ) و هي عندما تعدل سجلات مصدر البيانات

الذي يعتمد عليه المؤشر (أي مجموعة السجلات أو الجدول الذي يأخذ منه المؤشر بياناته ) فلن

ينعكس ذلك على السجلات التي يجلبها المؤشر لأنه يأخذ من النسخة المؤقتة كما أسلفت .

مثال 1 : أنشأ بداية قاعدة بيانات للأمثلة و ليكن اسمها Test_DB و اقرأ المثال التالي بهدوء

سيصعب عليك فهم بعض الأمور لكنك سرعان ما ستحصل على زبدة الكلام هذا بفضل

صبرك و ذكائك .. فلا تستعجل .

use Test_DB
Go

-- إنشاء جدول لنستخدمه في المؤشرات
Create Table C( id int , name nvarchar(50) )
Go

-- إدخال بعض القيم فيه
Insert C Values (1, 'Hmeed') 
Insert C Values (2, 'Smeer') 
Insert C Values (3, 'Aamer') 
Insert C Values (4, 'Sheeren') 
Insert C Values (5, 'Abdo') 

Go

-- التحقق من إدخال البيانات
Select * From C

------------------------------------

--  التصريح عن مؤشر عادي و قياسي
Declare A Cursor For Select * From C

-- فتح المؤشر لجلب البيانات منه
Open A

-- جلب السجل الأول
Fetch Next A 

-- سنعدل في السجل الثاني و سنرى كيف سينعكس ذلك على بيانات المؤشر
Update C Set Name = 'وليد'  Where id = 2 

--  ستجد أن المؤشر قد جلب البيانات المحدثة جلب السجل الذي قمت بتعديله بالعبارة السابقة
Fetch Next A

-- هل شاهدت السجل الذي عدلت بياناته
Select * From C



-- إغلاق المؤشر
Close A

-- تحرير بيانات المؤشر
DeAllocate A

------------------------------------

في المثال التالي :

-- لا تنعكس التعديلات على بيانات الجدول في المؤشر

-- التصريح عن مؤشر قياسي لكن غير حساس للتعديلات

-- (لأنه يتعامل مع نسخة من بيانات الجدول وليس مع الجدول نفسه )

Declare A Insensitive Cursor For Select * From C

Open A
Fetch A 

Update C Set Name = 'For You' Where id = 2 

Fetch A

Close A
DeAllocate A

Select * From C

------------------------------------

Scroll :

تجعل المؤشر يقبل كافة أنواع جلب السجلات (التالي , السابق , الأول , الأخير ,

Absolute , القريب) .. ستتعرف إلى كلٍ على حدى .

إذا لم نحدد هذا الخيار للمؤشر فإنه لن يقبل إلا الانتقال إلى السجل التالي بالعبارة Fetch ..

كما استخدمنا التعليمة Fetch في المثال السابق ..

select_statement :

ألا و هي كما تلاحظ أخي الكريم عبارة استعلام قياسية تعيد مجموعة من

السجلات RowSet ..

READ ONLY :

تمنع هذه العبارة استخدام العبارة Where Current Of للمؤشر

مع عبارات التعديل و الحذف .. الآن سأشرح لك ما المقصود بهذه العبارة

و كيف يتم استخدامها ...

مثال 2 : على استخدام العبارة Where Current Of للمؤشر ..

Declare A Cursor For Select * From C For Update

Open A

Fetch A 

-- كالتالي  C تقوم هذه العبارة بتعديل السجل الحالي للمؤشر في الجدول
Update C Set Name = 'For You' Where Current Of A

Fetch A

-- تقوم هذه العبارة بحذف السجل الذي جلبه السطر السابق
Delete From C Where Current Of A

-- شاهد التعديلات التي حصلت على سجلات الجدول المستهدف من قبل المؤشر
Select * From C

Close A
DeAllocate A

في الحقيقة الذي يجعل المؤشر للقراءة فقط في النوع القياسي من المؤشرات هو إحدى ثلاث أمور وهي:

1. أن يكون غير حساس ... أي Insensitive .. وقد سبق توضيح معناها .

2. أن يكون من النوع Scroll قابل للحركة في كافة الاتجاهات (سابق , تالي , أول , أخير .. الخ )

3. أن يكون للقراءة فقط Read Only ..

سنضرب ( بالعصا طبعاً ) الأمثلة التالية : أريدك ألا تحزن على هذه الأمثلة لأنها تستحق الضرب ..

مثال 3 :

لو أخذنا المثال السابق و وضعنا السطر التالي :

Declare A Scroll Cursor For Select * From C For Update

عوضاُ عن السطر :

Declare A Cursor For Select * From C For Update

ثم قمنا بتنفيذ المثال .. ماذا سيحصل ؟؟

سيعطيك المفسر رسالة خطأ تفيد بأن العبارة For Update لا تأتي مع المؤشرات من

نوعRead Only ... ذلك لأنك وضعت العبارة Scroll لتصريح المؤشر ..

مثال 4 : بنفس الطريقة لو وضعنا العبارة Insensitive لتصريح المؤشر كالتالي :

Declare A Insensitive Cursor For Select * From C For Update

أيضاً سيعطيك المفسر رسالة خطأ تفيد بأن العبارة For Update بأن العبارتين For Update و Insensitive

لا تجتمعان و بذلك عطلت Insensitive إمكانية التعديل للبيانات المؤشر ...

ارجع إلى الشرح السابق للخيار Insensitive لتعرف أكثر ما هو السبب .!!

مثال 5 : وضع الخيار Read Only For :

Declare A Cursor For Select * From C For Read Only

UPDATE [OF column_name [,...n]] :

هذا الخيار يسمح لك بجعل المؤشر يقبل حذف أو تعديل

سجله الحالي شرط ألا يكون هذا المؤشر للقراءة فقط كما ذكرنا للتو ..

أيضاً تمكنك هذه العبارة من تحديد الحقول التي سوف يسمح بتعديل قيمها عن طريق المؤشر

بعبارة الـ Update ..

و إذا بدون تحديد حقول ( باستخدام OF ) فهذا معناه أن كافة الحقول يسمح بتعديلها في السجل الحالي للمؤشر ..

مثال 6 :

-- Id التعديل مسموح فقط لقيم الحقل  
Declare A Cursor For Select * From C For Update OF id

Open A
Fetch A 

--   للسجل الحالي من المؤشرName لن تستطيع العبارة التالية تعديل بيانات الحقل  
Update C Set Name = 'T-SQL Is My Friend' Where Current Of A

Select * From C

Close A
DeAllocate A

مثال 7 : أما في هذا المثال ستتمكن من تعديل قيمة الحقل Name و ذلك لأننا حددنا الحقل Name

من المؤشر على أنه قابل للتعديل عن طريق العبارة Where Current Of ..

Declare A Cursor For Select * From C For Update OF Name
Open A
Fetch A 

--   للسجل الحالي من المؤشرName تستطيع العبارة التالية تعديل بيانات الحقل  
Update C Set Name = 'T-SQL Is My Friend' Where Current Of A

Select * From C

Close A
DeAllocate A

مثال 8 :أيضاُ في هذا المثال ستتمكن من تعديل قيمة الحقل Name و أي حقل من الجدول الذي

يستخدمه المؤشر كمصدر للبيانات وذلك لأننا لم نحدد أي عمود للعبارة For Update ..

Declare A Cursor For Select * From C For Update

و بذلك نكون قد أنهينا بعون الله الدرس الأول عن المؤشرات ..

لقاؤنا يتجدد في الدرس القادم بإذن الله ..

أخوكم في الله عماد ..

تم تعديل هذه المشاركة بواسطة imadouzoun في 2 أكتوبر 2006 في 22:01

دروس و كتب مفيدة----------------------كتيب الإجرائيات المخزنةتعرف على اللغة 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

#2

مشكوووووووووور

جهود مباركة

#3

مشكور على هذه المشاركة، واكيد في كثير من المعضلات يتعذر حلها الا بواسطة المؤشرات.

#4

الصيغة القواعدية للمؤشر من النوع الموسع :

DECLARE cursor_name CURSOR 
[ LOCAL | GLOBAL ] 
[ FORWARD_ONLY | SCROLL ] 
[ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ] 
[ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ] 
[ TYPE_WARNING ] 
FOR select_statement 
[ FOR UPDATE [ OF column_name [ ,...n ] ] ]

سأقوم بشرح هذه البارامترات مع الأمثلة الموضحة فلا تخف ستعرف سخافة هذه الاستخدام

و قوة المؤشرات فيما يلي :

LOCAL :

يقصد بها تحديد نوع المؤشر على أنه محلي بالنسبة للقطعة البرمجية ( المسماة في

T-SQL بالـ Batch ) التي تم تصريح المؤشر ضمنها .

و بالتالي فإن المؤشر معروف ضمن المجال الذي تم التصريح عن ذلك المؤشر فيه ...

وكأنك تعرف بـ Dim متحول في الفيجوال .. أو بـ Var محلية لإجرائية الحدث في دلفي ..

قلت لك لا تبدأ بالتذمر (صلّ على النبي ) لم نضع حتى الآن أية أمثلة , حاول أن تفهم الفكرة فقط..

ملحوظة : يعد كل من مما يلي قطعة برمجية : جسم الإجراء المخزن (Stored Procedure )

جسم القادح ( Trigger ) .

و لكن قد يطرأ على بالنا سؤال كالتالي :

إذا قمنا بتعريف مؤشر على أنه محلي ضمن الإجراء المخزن فهل يمكن تمريره كبارامتر

خرج للإجراء ؟

الجواب طبعاً يمكن ذلك .. ربما لم يصادف و أن تعاملت مع المؤشرات كبارامترات خرج

لإجراء مخزن , على كل لا تقلق بهذا الشأن فالأمثلة ستوضح كل لبس عندك بإذن الله .

ماذا يحصل للمؤشر المحلي عند انتهاء الـ Batch التي تم تصريحه فيها ؟

طبعاً ستستغني عن العبارة DeAllocate هنا لأن المؤشر يزول تلقائياً من الذاكرة بانتهاء

الـ Batch ..

و نستثني من هذه الحالة : عندما يمرر المؤشر إلى خارج القطعة البرمجية كبارامتر خرج و

يسند إلى متحول من نوع مؤشر ..

مثالها ( إجرائية فيها بارامتر خرج من نوع مؤشر وتم تمرير مؤشر محلي معرف

ضمن الإجرائية عبره و تلقفه متحول خارجي من نوع مؤشر أيضاً )

في هذه الحالة يتم تحرير المؤشر بتحرير المتحول خارجي الذي استخدم ذلك المؤشر ..

أحدهم : فتنا بالحيط !!!! .. وين الأمثلة اللي عم تحكي عنها يا عماد !!!؟؟؟؟

أنا : طوّل بالك .. لم ننهي بعد الكلام عن بارامترات الصيغة الموسعة من المؤشر ..

مثال 9 :

GLOBAL :

يحدد هذا الخيار أن المؤشر عام للاتصال الواحد بالقاعدة .. و هذا المؤشر سيكون

قابلاً للوصول من أي إجرائية أو قطعة برمجية تكتبها ضمن الاتصال الحالي بالقاعدة .

أما عن إزالة المؤشر من الذاكرة : فستكون بإحدى طريقتين :

إغلاق الاتصال بالقاعدة أو استخدام العبارة DeAllocate .. سنرى ذلك بالأمثلة اللاحقة .

بعد أن تكلمنا عن كلا الحالتين في المؤشر العام و المحلي سيتبادر للذهن أيضاً سؤال و هو :

إذا لم نحدد مدى المؤشر (عام أم محلي ) فما هي الحالة التي سيكون فيها المؤشر ؟

هو عام افتراضياً و يمكنك أن تغير الافتراضي باستخدام العبارة Alter DataBase مع

الخيارات التالية :

  < cursor_option > ::= 
		CURSOR_CLOSE_ON_COMMIT { ON | OFF } 
		| CURSOR_DEFAULT { LOCAL | GLOBAL }

FORWARD_ONLY :

تحدد المؤشر على أنه غير قابل على جلب سوى السجل التالي

باستخدام Fetch Next أي من السجل الأول إلى الأخير و باتجاه واحد ...

عندما يحدد الخيار FORWARD_ONLY مع تصريح المؤشر بدون الخيارات

(Static , KeySet Or Dynamic ) فإن المؤشر سيعمل على أنه Dynamic ..

سنأتي على ذكر الخيارات الثلاثة السابقة فيما يأتي .. فقط عليك أن تتابع في هذا الدرس الجميل .

أحدهم : لقد عرفت الآن ما معنى الخيار السابق بالإضافة أنني تعرفت على الخيار Scroll الذي تم شرحه مع النوع القياسي من للمؤشر ..

و السؤال الآن :

إذا لم أحدد أياً من الخيارين (Scroll و FORWARD_ONLY) فما ستكون عليه حالة المؤشر ؟

الإجابة على النحو التالي :

الافتراضي هو FORWARD_ONLY إلا إذا قمت بتحديد أحد الخيارات التالية :

(Static , KeySet Or Dynamic ) في هذه الحالة سيكون من نوع SCROLL .

STATIC :

تجعل المؤشر يتعامل مع نسخة مؤقتة من بيانات المصدر (استعلام SQL)

ينشئها في القاعدة المؤقتة Tempdb .. هذا الخيار يطابق بالعمل الخيار INSENSITIVE

للنوع القياسي للمؤشر ..

أيضاً لا يسمح لك باستخدام العبارة WHERE CURRENT OF مع الحذف و التعديل .

و التعديلات التي نقوم بها (من حذف و تعديل و إضافة) على مصدر البيانات لا تنعكس

على بيانات المؤشر عند استخدام العبارة Fetch التي تستخدم لجلب السجلات ..

وقد ذكرت للتو السبب , وهو أن هذا النوع من المؤشر يتعامل مع نسخة مؤقتة من بيانات المصدر .

KeySet :

سأترك الحديث عن هذا الخيار لأنه خيار متقدم و يطول شرحه و سأهتم

بالخيارات السهلة التي تعطي نتائج بالسرعة المرجوة ...

DYNAMIC :

من الكلمة ستعرف نصف عمل هذا الخيار أو أكثر ..

سيجعل هذا الخيار المؤشر ديناميكياً قادراً على أن يعكس كل التغييرات و التعديلات التي تجرى

لمصدر البيانات بعيداً عن المؤشر عندما تجلب سجلات بواسطة الـ Fetch ..

بالإضافة إلى أنه يمكنك من استخدام العبارة Where Current Of مع عبارات الحذف و التعديل

لبيانات هذا المؤشر ..

بالنسبة لإمكانيته في جلب السجلات بواسطة Fetch .. فهو قادر على كل أنواع الحركة التالية

(الأول , السابق , التالي , الأخير , المتعلق بالحالي Relative ) إلا مع الـ Absolute (التي تجلب السجل ذو الترتيب المعطى كرقم ) سنتحدث عن الـ Fetch لاحقاً لتوضيح الإمكانات المتاحة لجلب السجلات ..

FAST_FORWARD :

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

عند استخدام الـ Fetch وبالتالي فهو لا يأتي مع الخيارينSCROLL و FOR_UPDATE

كما أنه يجعل المؤشر للقراءة فقط أي لا تستطيع استخدام العبارةWhere Current Of

عند التعديل أو الحذف ..

READ_ONLY :

يمنع هذا الخيار عند تعيينه للمؤشر عمليات التعديل و الحذف باستخدام هذا المؤشر

( Where Current Of ) ..

SCROLL_LOCKS :

يستخدم هذا الخيار لضمان عمليات تعديل و حذف السجلات عبر المؤشر

بواسطة الـ Where Current OF , هذا الخيار لا يأتي مع FAST_FORWARD .

ملاحظة : قد يمر معك المصطلح التالي أثناء قراءتك عن المؤشرات

( positioned updates or deletes ) و معناه :

التعديل أو الحذف عبر المؤشر بواسطة الـ Where Current Of .

OPTIMISTIC :

هذا يمثل حساسية المؤشر عند تعديل أو حذف السجل الحالي والذي تم جلبه بواسطة Fetch

بعبارة Update أوDelete اعتيادية أقصد دون Where Current Of

أما عن آلية ذلك ولو أنها ليست ذات أهمية كبيرة :

فهو يقوم بمقارنة قيم حقل من نوع البيانات timestamp إن وجد وإن لم يجد حقلاً كهذا

في الجدول لجأ إلى قيم الـ Checksum ( راجع الـ Help لمعلومات أكثر )..

وذلك ليعرف هل السجل الذي تم جلبه قد عدل خارج المؤشر بعد جلبه بالـ Fetch أم لا .. ؟؟

فإذا كان ذلك عندها ستفشل عملية التعديل أو الحذف بواسطة Where Current Of ..

أيضاً يمكنك أن تستنتج أن هذا الخيار لا يجتمع مع FAST_FORWARD لأنه طبعاً يسمح

لك بالتعديل أما الخيار FAST_FORWARD فيجعل المؤشر للقراءة فقط ..

لا بد من مثال موضح :

TYPE_WARNING :

وهو ليس بالخيار الهام و هو لطباعة رسالة تحذيرية

عند تحويل المؤشر من نمط إلى آخر ..

هذا الخيار لم أجد له مثالاُ موضحاً لذا سأهمل شرحه ..

قي أمامنا فقط الخيارين :

FOR select_statement :

تم شرحه مع النوع القياسي من المؤشرات ..

[ FOR UPDATE [ OF column_name [ ,...n ] ] ] :

تم شرحه مع النوع القياسي من المؤشرات ..

إلى أن نلتقي في درس آخر لكم مني التحية و الدعاء و السلام ..

بالتوفيق للجميع ..

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

دروس و كتب مفيدة----------------------كتيب الإجرائيات المخزنةتعرف على اللغة 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

#5

الف شكر عماد اوزون

صديقك مصطفى العشي

اعبد الله كأنك تراه .........

#6

بارك الله فيك

انا جديد على SQL SERVER ولم اتعامل معه الا من خلال اكسس كمستودع للبيانات فقط

فاين تكتب هذه الاكواد

#7

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

في الـ Query Analyzer يا صاحبي :rolleyes:

post-35322-1181483991_thumb.jpg

دروس و كتب مفيدة----------------------كتيب الإجرائيات المخزنةتعرف على اللغة 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

#8

مشكور اخى الغالى عماد فعلا انت متميز

وشرح اكثر من رائع

وعاوزينك توضح لينا اكتر الجزء بتاع

global | local

بالامثله وجزاك الله خيرا وجعله فى ميزان حسناتك

#9

كم انا شاكرا لك بارك الله فيك

بس هل استطيع ان اتحكم في صفوف البيانات خطوة خطوة

بمعني

اخترت مجموعة بيانات

اذهب اللصف الاول

RR

اذا وصلت لأخر الصف GOTO EE

اذا ID = 1 اذن اذهب الجراء معين او بمكني منادات بروسيدر اخر

اذهب للصف التالي

GOTO RR

EE

-----------

اسف احتاج هذه الطريقه

تم تعديل هذه المشاركة بواسطة sattyware في 23 يونيو 2009 في 21:34

#10

السلام عليكم اخي الكريم

بارك الله فى علمك ووقتك وغفر لك ذنبك

اخوك فى الله

Microsoft Certified DataBase Administrator MCDBA

#11

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

بالنسبة للفرق بين الـ Global Cursor و الـ Local Cursor :

Create Table Contact(Id int , Name Nvarchar(50))
GO


-- a simple global cursor will be like this

Declare C Cursor Global For Select * From Contact Open C
	-- here you can fetch the data of Contact table
Close C 
DeAllocate C

GO


-------------------------------------
-- First : Global Cursor
-------------------------------------

--let us try to create a new stored procedure containing the same cursor declaration

Create Proc Create_Global_Cursor
AS -- notice that the following cursor is a Global Cursor

	Declare C Cursor Global For Select * From Contact Open C

GO

-- notice that the stored procedure has not closed and deallocated the cursor yet!  :)
-- that means the global cursor is still available for the same connection and it will still alive until 
-- closing the connection as we are going to see.


create proc Use_Global_Cursor
AS Close C
	DeAllocate C

GO
-- select the stored procedures by mouse and press (F5) to create them



-- now try the following [Select the two lines and press F5 ] :

Exec Create_Global_Cursor
Exec Use_Global_Cursor

-- it works !



-- notice that you can not declare a cursor with the same name 'C' in prcedure 'Use_Global_Cursor' until 
-- you Close & DeAllocate it because there is a global cursor with the same name 'C' available !
-- I mean : try to alter procedure 'Use_Global_Cursor' like this :


Alter proc Use_Global_Cursor
AS Declare C Cursor Global For Select ID From Contact Open C

GO
-- select the stored procedure by mouse and press (F5) to alter it



-- then try to execute the procedures like this [Select the two lines and press F5 ] :

Exec Create_Global_Cursor
Exec Use_Global_Cursor

-- it does not work !

-------------------------------------
-- Second : Local Cursor
-------------------------------------

Create Proc Create_Local_Cursor
AS -- notice that the following cursor is a Global Cursor

	Declare CR Cursor Local For Select * From Contact Open CR

GO

Create proc Create_Another_Local_Cursor
AS Declare CR Cursor Local For Select ID From Contact Open CR

GO

-- select the stored procedures by mouse and press (F5) to create them

-- then try to execute the procedures like this :

Exec Create_Local_Cursor
Exec Create_Another_Local_Cursor

-- it works !

أرجو الفائدة للجميع .

تم تعديل هذه المشاركة بواسطة imadouzoun في 29 أغسطس 2009 في 01:36

دروس و كتب مفيدة----------------------كتيب الإجرائيات المخزنةتعرف على اللغة 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

#12

اكرمك الله

1

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