آموزش Cursor در SQL Sever

آموزش Cursor در SQL Sever

بسم الله الرحمن الرحیم

آموزش Cursor در SQL Sever

در بسیاری مواقع شما نیاز دارید اطلاعات را به صورت رکورد به رکورد بررسی کنید، اولین راه حل ایجاد یک برنامه است اما اگر بخواهیم این کار را در SQL انجام دهیم چطور؟ همانطور که مشخص است دستور SELECT این کار را برای ما انجام می دهد با این تفاوت که نمی توانیم تک تک رکوردها را بررسی کنیم بلکه خروجی دستور SELECT یک ResualtSet یا در واقع یک Dataset است.

دستور Cursor  می تواند خروجی دستور SELECT را در حافظه نگه دارد و تک تک آنها را بررسی کند.

مثال

@id uniqueidentifier,
@userName varchar(20),
@password varchar(20)

DECLARE AccountRows CURSOR FOR SELECT id,userName,password FROM Account

 

AccountRows متغییری از جنس CURSOR تعریف کردیم تا اطلاعات را در خود ذخیره کند.

 

 

بسم الله الرحمن الرحیم

آموزش Cursor در SQL Sever

در بسیاری مواقع شما نیاز دارید اطلاعات را به صورت رکورد به رکورد بررسی کنید، اولین راه حل ایجاد یک برنامه است اما اگر بخواهیم این کار را در SQL انجام دهیم چطور؟ همانطور که مشخص است دستور SELECT این کار را برای ما انجام می دهد با این تفاوت که نمی توانیم تک تک رکوردها را بررسی کنیم بلکه خروجی دستور SELECT یک ResualtSet یا در واقع یک Dataset است.

دستور Cursor  می تواند خروجی دستور SELECT را در حافظه نگه دارد و تک تک آنها را بررسی کند.

مثال

@id uniqueidentifier,
@userName varchar(20),
@password varchar(20)

DECLARE AccountRows CURSOR FOR SELECT id,userName,password FROM Account

 

AccountRows متغییری از جنس CURSOR تعریف کردیم تا اطلاعات را در خود ذخیره کند.

 

OPEN AccountRows
WHILE @@FETCH_STATUS = 0
BEGIN
FETCH NEXT FROM AccountRows
INTO
@id ,@userName,@password
PRINT @id
END
CLOSE AccountRows
DEALLOCATE AccountRow

 

WHILE @@FETCH_STATUS = 0  این دستور باعث می شود تا زمانی که رکوردی وجود دارد اطلاعات واکشی شود، متغییر مربوطه تا زمانی که رکوردی وجود دارد صفر است.

حال ممکن است شما بخواهید رکوردی با اندیس خاص را بخوانید برای این کار می بایست CURSOR را به صورت SCROLL تعریف کنیم. مثال:

 


DECLARE @id uniqueidentifier
DECLARE @userName nvarchar(100)
DECLARE @password varchar(100)

DECLARE AccountRows SCROLL CURSOR FOR SELECT id,userName,password FROM Account
FOR UPDATE OF id,userName
OPEN AccountRows
FETCH ABSOLUTE 5 FROM AccountRows
UPDATE Account SET userName = 'ESH' WHERE CURRENT OF AccountRows

FETCH NEXT FROM AccountRows
FETCH RELATIVE 7 FROM AccountRows
FETCH PRIOR FROM AccountRows

 

FETCH ABSOLUTE 5 FROM AccountRows این دستور باعث می شود رکورد 5 بازیابی شود

FOR UPDATE OF id,userName این دستور مشخص می کند که فقط دو فیلد مشخص شده می توانند بروز شوند

WHERE CURRENT OF AccountRows این بخش دستور مشخص می کند که فقط رکورد واکشی شده جاری بروز شود

 

FETCH FIRST: به محل اولین رکورد می رود.

FETCH LAST: به محل آخرین رکورد می رود.

FETCH ABSOLUTE: به یک رکورد خاص می رود(اندیس در SQL با یک شروع می شود).

FETCH RELATIVE: اگر عدد مثبت بدهیم به جلو حرکت می کند و اگر عدد منفی بدهیم به عقب حرکت می کند.

FETCH PRIOR: رکورد قبلی را بازیابی می کند.

 

نظرات

  • Hannah Martinez
    محمدرضا
    دو شنبه 11 دی 1278 - 0:00

    خیلی عالی و ساده و تمیز

    دستون درد نکنه

    • Judith Bell
      پاسخ
      اسماعیلشیدایی
      دو شنبه 11 دی 1278 - 0:00

      با عرض سلام
      ممنون از لطف شما

  • Hannah Martinez
    khatoon
    دو شنبه 11 دی 1278 - 0:00

    mamnonam .. tozihat baraye shoro khobe vali kash mesalash bishtar bod

    .. bazzam mamnn

  • Hannah Martinez
    سیناحسینی
    دو شنبه 11 دی 1278 - 0:00

    ممنونیم بابت اینکه مطالب ما رو به دقت مطالعه و مشکلات را به ما گوشزد میکنید امید واریم بتونیم روز به روز بهتر و با کیفیت بیشتری اطلاعات رو در اختیار شما عزیزان قرار دهیم.

  • Hannah Martinez
    khatere
    دو شنبه 11 دی 1278 - 0:00

    درود .
    خوشحالم که سایت های فارسی دارند کم کم انرژی میذارن و مراجع فارسی زبان هم داره باب میشه.
    امیدوارم به زودی مراجع فارسی هم مثل انگلیسی قوی و به روز بشه.
    ممنون از تلاش شما .

  • Hannah Martinez
    علیاسلامی
    دو شنبه 11 دی 1278 - 0:00

    درود بر شما دوست عزیز 
    ما هم خوشحالیم از این پیشرفت و هر روز تلاشمان را بیشتر میکنیم به آن چیزی که باید خیلی زود تر از اینها به آن میرسیدیم برسیم 
    ممنون از توجه شما و مطالعه مطالب ما.
    با آرزوی موفقیت

  • Hannah Martinez
    مهران
    شنبه 12 مرداد 1398 - 19:32

    سلام و خسته نباشید

    عالی بود

    سپاسگزارم موفق باشید

  • Hannah Martinez
    سپید
    پنج شنبه 29 خرداد 1399 - 10:51

    درود و سپاس از مطلبتون

    درمورد WHILE @@FETCH_STATUS = 0 نوشته اید متغییر مربوطه تا زمانی که رکوردی وجود دارد صفر نمی شود، این عبارت اشتباه است، در واقع هربار که Fetch با موفقیت انجام میشود صفر بر میگرداند و همانطور که حلقه ی while گویای مطلب است مادامیکه صفر برگرداند ، به Fetch ادامه می دهد.

     

    لطفا تصحیح فرمایید.

    • Judith Bell
      پاسخ
      اسماعیلشیدایی
      پنج شنبه 29 خرداد 1399 - 10:51

      سلام و درود
      ممنون از لطفتان
      بله حتما

نظرات یا سوالات خودرا با ما درمیان بگذارید

0912 097 5516 :شماره تماس
0713 625 1757 :شماره تماس