من می خوام در مورد Cursor (مکان نما ) در Sql صحبت کنم و قابلیت بسیار جالب که مطمئنم زیاد بکارتون میاد . در حالت عادی وقتی نتایج یک کوئری که نوشتین رو میگیرین همه نتایج به صورت یکجا برای شما برگردونده میشن مثلا فرض کنید جدولی داریم به نام person که مشخصات یک سری افراد رو براتون نگه داری می کنه .و کوئری به این صورت مینویسین : کد: <CODE>select * from person</CODE> همونطور که کاملا مشخصه این کوئری تمام سطرهای جدول PERSOn رو به صورت یکجا برای شما نشون میده . منظورم از یکجا اینه که شما به تک تک سطرهایی که توسط این دستور برگردانده می شه به صورت جداجدا در حالت عادی دسترسی ندارید . ممکنه مواقعی بخواهید به نتایجی که از اجرای یک کوئری برای شما برگردونده میشه به صورت سطری دسترسی داشته باشین . خوب این کار با وجود مکان نما بسیار ساده و راحت هستش .یعنی با استفاده از مکان نما می تونین به تک تک سطرهای رگردانده شده به صورت جداگانه دسترسی داشته باشید . برای استفاده از مکان نما باید چند مرحله رو پشت سر هم به صورت یک قانون کلی مد نظر داشته باشین . اول باید یک سری متغییر برای نگه داری مقادیری که می خواهید از نتایج بدست آمده در هر سطر نگه داری کنید تعریف کنید که این کار (تعریف متغییر رو با عبارت declare انجام می دهید ومقدار دهی به متغییر با عبارت set که در آموزشهای بعدی کامل مورد بررسی قرار می گیره ) و بعد از این مرحله باید مکان نمای رو تعریف کنید و همچین متن کوئری که مد نظر شماست . این کوئری تا زمانی که مکان نما اجرا نشه ، اجرا نمی شمو ، یعنی اجرای کوئری به گردن مکان نما می افتد . در مرحله بعدی باید مکان نما رو با دستودopen باز کنید در این مرحله هستش که کوئری که در مرحله قبل تعریف کردین اجرا میشه و مکان نما به صورت پیش فرض روی سطر اول اون نتایج قرار داره . در مرحله بعدی باید مکان نما رو روی سطر های نتایج خروجی جلو بردی و روی هر سطر عملی رو که مخواهید انجام بدین و در انتها مکان نما رو ببندین . سعی می کنم با یک مثال مکان نما رو بررسی کنم ، حالا ممکنه که این مثال صددرصد نتونه کارایی مکان نما رو برای شما روشن کنه ولی حداقل نحوه استفاده از مکان نما رو یاد می گیرید و در کوئری های خودتون استفاده بهینه از مکان نما رو انجام میدین . من یک جدول دارم به نام person که دارای فیلدهای زیر هستش : Name, Surname,Telnunber,Address من در مثال زیر که از مکان نما استفاده کردم می خوام دو سطر اول جدول person رو انتخاب کنم و بعد با استفاده از نام هر یک از این سطرها یک سطر جدید به جدولم اضافه کنم که نام فرد جدید نام همان فردی باشه که توی هر سطر خروجی دارم از مکان نما می گیرم : با توجه به اینکه ممکنه بیشتر از یک سطر در خروجی داشته باشیم از یک حلقه while برای خوندن همه سطرها استفاده می کنیم که بعدا به طور کامل بررسی میشه . از متغییر @cursor_status هم برای این استفاده می کنیم که مطمئن بشیم در خوندن سطرها توسط مکان نما هیچ گونه مشکلی وجود نداره که اگر این متغییر مساوی صفر باشد یعنی مشکلی وجود ندارد . کد: <CODE>DECLARE @name nvarchar(30) DECLARE @tel int SET @tel = 10 DECLARE namecursor CURSOR FOR SELECT TOP 2 name FROM person OPEN namecursor WHILE @@fetch_status = 0 BEGIN FETCH next FROM namecursor INTO @name INSERT INTO person(name, surname, telnumber, address) VALUES (@name, 'yyyyyy', CONVERT(nvarchar,@tel), 'aaaaaaaa') SET @tel = @tel + 1 END CLOSE namecursor</CODE>