آموزش 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: رکورد قبلی را بازیابی می کند.
محمدرضا
خیلی عالی و ساده و تمیز
اسماعیلشیدایی
با عرض سلام
ممنون از لطف شما
khatoon
mamnonam .. tozihat baraye shoro khobe vali kash mesalash bishtar bod
.. bazzam mamnn
سیناحسینی
ممنونیم بابت اینکه مطالب ما رو به دقت مطالعه و مشکلات را به ما گوشزد میکنید امید واریم بتونیم روز به روز بهتر و با کیفیت بیشتری اطلاعات رو در اختیار شما عزیزان قرار دهیم.
khatere
درود .
خوشحالم که سایت های فارسی دارند کم کم انرژی میذارن و مراجع فارسی زبان هم داره باب میشه.
امیدوارم به زودی مراجع فارسی هم مثل انگلیسی قوی و به روز بشه.
ممنون از تلاش شما .
علیاسلامی
درود بر شما دوست عزیز
ما هم خوشحالیم از این پیشرفت و هر روز تلاشمان را بیشتر میکنیم به آن چیزی که باید خیلی زود تر از اینها به آن میرسیدیم برسیم
ممنون از توجه شما و مطالعه مطالب ما.
با آرزوی موفقیت
مهران
سلام و خسته نباشید
عالی بود
سپاسگزارم موفق باشید
سپید
درود و سپاس از مطلبتون
درمورد WHILE @@FETCH_STATUS = 0 نوشته اید متغییر مربوطه تا زمانی که رکوردی وجود دارد صفر نمی شود، این عبارت اشتباه است، در واقع هربار که Fetch با موفقیت انجام میشود صفر بر میگرداند و همانطور که حلقه ی while گویای مطلب است مادامیکه صفر برگرداند ، به Fetch ادامه می دهد.
لطفا تصحیح فرمایید.
اسماعیلشیدایی
سلام و درود
ممنون از لطفتان
بله حتما