Cursors In Sql Server - کرسر
SQL بر اساس مجموعه کار میکند. به طور مثال دستور select مجموعهای از ردیف ها را بر می گرداند که به آن مجموعه نتایج می گویند.
اگر بخواهیم روی ردیف به ردیف نتایج پردازش کنیم به طور مثال آنها را چاپ کنیم، یا در مثال واقعی تر آنها را در جدول دیگری درج کنیم یا بر اساس شرایطی آنها را بروز یا حذف کنیم در اینجا می توانیم از Cursor استفاده کنیم.
کرسر بانک اطلاعات چیست؟
کرسر بانک اطلاعات شی ای است که پیمایش روی ردیف های مجموعه داده را امکانپذیر می کند. کرسر به شما اجازه میدهد تا یک ردیف تکی برگشت شده از پرس و جو را پردازش کنید.
چرخه زندگی کرسر SQL Server
گام های استفاده از کرسر:
اول، یک کرسر تعریف کنید.
DECLARE cursor_name CURSOR
FOR select_statement;
برای تعریف کرسر، نام آن را بعد از کلمه کلیدی Declare همراه نوع داده Cursor تعریف کنید و یک دستور select بعد از آن بنویسید که مجموعه نتایج برای کرسر را مشخص کند.
سپس، کرسر را با اجرای دستور select باز و دستکاری کنید.
OPEN cursor_name;
در گام بعد، یک ردیف از کرسر را داخل یک یا چند متغیر واکشی کنید.
FETCH NEXT FROM cursor INTO variable_list;
Sql Server تابعی به نام @@FETCHSTATUS فراهم کرده که وضعیت آخرین کرسر دستور fetch را بر میگرداند، اگر @@fetchstatus مقدار 0 را برگرداند یعنی دستور fetch موفقیت آمیز بوده است. شما میتوانید از دستور while استفاده کنید تا همه ردیف های کرسر را به صورتی که در کد زیر نشان داده شده بر گردانید.
WHILE @@FETCH_STATUS = 0
BEGIN
FETCH NEXT FROM cursor_name;
END;
بعد از آن کرسر را ببندید.
CLOSE cursor_name;
سرانجام، کرسر را از حافظه حذف کنید.
DEALLOCATE cursor_name;
مثال کرسر SQL Server
ما از جدول production.products به عنوان مثال استفاده میکنیم تا نحوه استفاده از کرسر را نشان دهیم.
اول، دو متغیر تعریف کنید تا نام محصول و قیمت را نگهداری کند و همچنین یک کرسر به منظور نگهداری نتایج پرس و جویی که نام محصول و قیمت آن را از جدول production.products میگیرد را نگهداری کند:
DECLARE
@product_name VARCHAR(MAX),
@list_price DECIMAL;
DECLARE cursor_product CURSOR
FOR SELECT product_name, list_price
FROM production.products;
سپس کرسر را باز کنید:
OPEN cursor_product;
سپس، هر ردیف را از کرسر واکشی میکنیم و نام و قیمت محصول را چاپ می کنیم:
FETCH NEXT FROM cursor_product INTO
@product_name,
@list_price;
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT @product_name + CAST(@list_price AS varchar);
FETCH NEXT FROM cursor_product INTO
@product_name, @list_price;
END;
بعد از آن، کرسر را ببندید.
CLOSE cursor_product;
سرانجام، کرسر را deallocate کنید تا آن را رها کنید و از حافظه حذف شود.
DEALLOCATE cursor_product;
قطعه کد زیر همه گفتهها را یکی کرده است.
DECLARE
@product_name VARCHAR(MAX),
@list_price DECIMAL;
DECLARE cursor_product CURSOR
FOR SELECT product_name, list_price
FROM production.products;
OPEN cursor_product;
FETCH NEXT FROM cursor_product INTO
@product_name, @list_price;
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT @product_name + CAST(@list_price AS varchar);
FETCH NEXT FROM cursor_product INTO @product_name, @list_price;
END;
CLOSE cursor_product;
DEALLOCATE cursor_product;
خروجی این دستور به صورت زیر است: