Cursors In Sql Server - کرسر

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;

خروجی این دستور به صورت زیر است: