زنگ.

کسانی هستند که این خبر را قبل از شما خوانده اند.
مشترک شدن برای دریافت مقالات تازه.
پست الکترونیک
نام
نام خانوادگی
چگونه می خواهید زنگ را بخوانید
بدون هرزنامه

SQL - درس 15. روش های ذخیره شده. قسمت 1.

به عنوان یک قانون، ما از همان درخواست ها برای کار با پایگاه داده یا مجموعه ای از پرس و جو سریال استفاده می کنیم. روش های ذخیره شده به شما این امکان را می دهد که دنباله ای از درخواست ها را ترکیب کنید و آنها را در سرور ذخیره کنید. این یک ابزار بسیار راحت است، و در حال حاضر شما در مورد آن مطمئن شوید. بیایید با نحو شروع کنیم:

ایجاد PROCEDURE_PROCEDARE نام اپراتورها پایان می یابد

پارامترها این داده ها هستند که ما این روش را هنگام فراخوانی آن انتقال خواهیم داد، و اپراتورها در واقع درخواست می شوند. بیایید اولین روش خود را بنویسیم و از راحتی آن اطمینان حاصل کنیم. در کلاس 10، هنگامی که ما ورودی های جدید را در پایگاه داده فروشگاه اضافه کردیم، از یک درخواست استاندارد برای اضافه کردن نوع استفاده کردیم:

به مشتریان (نام، ایمیل) ارزش ("Ivanov Sergey"، " [ایمیل محافظت شده]");

زیرا پرس و جو مشابه ما هر بار که ما نیاز به اضافه کردن یک خریدار جدید داریم، استفاده خواهیم کرد، کاملا مناسب است که آن را در قالب روش ترتیب دهید:

ایجاد روش ins_cust (n char (50)، e char (50)) شروع به وارد کردن به مشتریان (نام، ایمیل) ارزش (n، e)؛ پایان.

لطفا توجه داشته باشید که چگونه پارامترها تنظیم می شوند: لازم است نام پارامتر را مشخص کنید و نوع آن را مشخص کنید، و در قسمت از روش ما از نام پارامتر استفاده می کنیم. یک نانوایی همانطور که به یاد می آورید، نقطه با کاما به معنای پایان درخواست است و آن را برای اجرای آن ارسال می کند که در این مورد غیر قابل قبول است. بنابراین، قبل از اینکه روش را بنویسید، باید جداساز را لغو کنید؛ در "//" به طوری که درخواست پیش از زمان ارسال نمی شود. این کار با استفاده از delimiter // انجام می شود:

بنابراین، ما نشان دادیم که DBMS که اکنون دستورات را دنبال می کند، بعد از // دنبال می شود. باید به یاد داشته باشید که بیش از حد جداساز تنها برای یک جلسه انجام می شود، I.E. دفعه بعد که شما با MySQL جلسه می کنید، جداکننده دوباره به یک علامت تبدیل می شود و در صورت لزوم باید دوباره آن را دوباره تعریف کند. حالا شما می توانید این روش را قرار دهید:

ایجاد روش ins_cust (n char (50)، e char (50)) شروع به وارد کردن به مشتریان (نام، ایمیل) ارزش (n، e)؛ پایان //


بنابراین روش ایجاد شده است. در حال حاضر، هنگامی که ما باید یک خریدار جدید وارد کنیم، به اندازه کافی برای ما تماس می گیریم، مشخص کردن پارامترهای لازم. برای تماس با روش ذخیره شده، بیانیه تماس استفاده می شود، پس از آن نام روش و پارامترهای آن مشخص می شود. بیایید یک خریدار جدید را به خریداران جدول ما اضافه کنیم (مشتریان):

تماس بگیرید ins_cust ("والری Sychov"، " [ایمیل محافظت شده]")//


موافقید که هر بار یک درخواست کامل، بسیار ساده تر از نوشتن است. بررسی کنید که آیا این روش کار می کند، به دنبال اینکه یک خریدار جدید در خریداران جدول ظاهر شود (مشتریان):

ظاهر شد، این روش کار می کند، و همیشه کار می کند تا زمانی که ما آن را با استفاده از اپراتور حذف کنیم روش قطره name_processures.

همانطور که در ابتدای درس ذکر شد، روش ها به شما این امکان را می دهد که توالی درخواست ها را ترکیب کنید. بیایید ببینیم که چگونه انجام می شود. به یاد داشته باشید در درس 11 ما می خواستیم بدانیم چقدر آن را به ما ارائه دهنده تامین کننده چاپ خانه به ارمغان آورد؟ برای انجام این کار، ما مجبور شدیم از درخواست های سرمایه گذاری، انجمن ها، ستون های محاسبه شده و ارائه ها استفاده کنیم. و اگر ما می خواهیم بدانیم که چقدر محصول به ما یک تامین کننده دیگر به ما آورده است؟ ما باید درخواست های جدید، انجمن ها و غیره را ایجاد کنیم یک بار برای این عمل یک روش ذخیره شده را آسان تر می کند.

به نظر می رسد که 11 ارائه و پرس و جو به آن قبلا در کلاس 11 نوشته شده است به راحتی نوشته شده است، ترکیب شناسه تامین کننده (ID_VENDOR) پارامتر، مانند این:

ایجاد روش sum_vendor (I int) شروع به ایجاد مشاهده گزارش_vendor به عنوان انتخاب magazine_incoming.id_product، magazine_incoming.quantity، prices.price، magazine_incoming.quantity * prices.price به عنوان summa از magazine_incoming، قیمت ها که magazine_incoming.id_product \u003d prices.id_product@id_incoming \u003d ( ID_INCUMING را از ورودی انتخاب کنید که ID_VENDOR \u003d I)؛ مجموع را انتخاب کنید (Summa) از Report_vendor؛ پایان //

اما بنابراین روش کار نخواهد کرد. این چیزی است که موقعیت ها نمی توانند از پارامترها استفاده کنند. بنابراین، ما باید توالی درخواست ها تا حدودی را تغییر دهیم. ابتدا یک نمایه ایجاد می کنیم که یک شناسه عرضه کننده (ID_VENDOR)، شناسه محصول (ID_PRODUCT)، مقدار، قیمت (قیمت) و مقدار (SUMMA) را از سه جداول تحویل (ورودی)، قیمت ها (Magazine_incomming)، قیمت ها (قیمت ها) نمایش می دهد :

ایجاد نمایش Report_vendor به عنوان انتخاب Incoming.id_vendor، magazine_incoming.id_product، magazine_incomming.idity، prices.price، magazine_incoming.quantity * prices.price به عنوان summa از ورودی، magazine_incoming، قیمت ها که در آن magazine_incoming.id_product \u003d prices.id_product_incomming.id_incomcoming \u003d ورودی .id_incoming؛

و سپس یک درخواست ایجاد کنید که مبلغ تأمین منابع تامین کننده مورد علاقه ما را جمع آوری کند، به عنوان مثال، با id_vendor \u003d 2:

در حال حاضر ما می توانیم دو مورد از این درخواست ها را به روش ذخیره شده ترکیب کنیم، جایی که پارامتر ورودی شناسه تامین کننده (ID_Vendor) است که در درخواست دوم جایگزین خواهد شد، اما نه در ارائه:

ایجاد روش sum_vendor (I int) شروع به ایجاد مشاهده گزارش_vendor به عنوان انتخاب INCAVING.ID_VENDOR، magazine_incoming.id_product، magazine_incoming.quantity، prices.price، magazine_incomcoming.quantity * prices.price به عنوان summa از ورودی، magazine_incoming، قیمت ها که در آن magazine_incoming.id_product \u003d قیمت ها .id_product و magazine_incoming.id_incoming \u003d incoming.id_incoming؛ مجموع را انتخاب کنید (Summa) از Report_vendor که ID_VENDOR \u003d I؛ پایان //


کار روش را با پارامترهای ورودی مختلف بررسی کنید:


همانطور که می بینید، این روش یک بار باعث می شود، و سپس یک خطا را به ما می دهد، به ما می گوید که نمایش گزارش report_vendor در پایگاه داده در دسترس است. این به این دلیل است که هنگام دسترسی به روش برای اولین بار، آن را ایجاد می کند. هنگام دست زدن به یک بار دوم، تلاش می کند دوباره ارائه شود، اما در حال حاضر وجود دارد، بنابراین یک خطا ظاهر می شود. برای اجتناب از این دو گزینه ممکن است.

اول این است که یک ایده از روش را ایجاد کنیم. به این ترتیب، ما یک بار یک ایده را ایجاد می کنیم، و این روش فقط با او تماس می گیرد، اما نه آن را ایجاد کنید. قبلا فراموش نکنید که روش و ارائه شده در حال حاضر ایجاد شده را حذف کنید:

روش قطره Sum_vendor // Drop View Report_vendor // ایجاد مشاهده گزارش_vendor به عنوان انتخاب Incoming.id_vendor، magazine_incoming.id_product، magazine_incoming.quantity، prices.price، magazine_incoming.quantity * prices.price به عنوان summa از ورودی، magazine_incoming، قیمت که magazine_incoming.id_product \u003d prices.id_product و magazine_incoming.id_incoming \u003d incoming.id_incoming // ایجاد روش sum_vendor (I int) شروع Sum را انتخاب کنید (Summa) از Report_vendor که ID_VENDOR \u003d I؛ پایان //


بررسی کار:

تماس sum_vendor (1) // call sum_vendor (2) // call sum_vendor (3) //


گزینه دوم - درست در روش برای اضافه کردن یک فرمان که این دیدگاه را حذف می کند، اگر وجود داشته باشد:

ایجاد روش sum_vendor (I int) شروع قطره مشاهده اگر گزارش report_vendor؛ ایجاد نمایش Report_vendor به عنوان انتخاب Incoming.id_vendor، magazine_incoming.id_product، magazine_incomming.idity، prices.price، magazine_incoming.quantity * prices.price به عنوان summa از ورودی، magazine_incoming، قیمت ها که magazine_incoming.id_product \u003d قیمت. .id_incoming؛ مجموع را انتخاب کنید (Summa) از Report_vendor که ID_VENDOR \u003d I؛ پایان //

قبل از استفاده از این گزینه، فراموش نکنید که روش sum_vendor را حذف کنید، سپس عملیات را بررسی کنید:

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

شامل رویه های شما یک خط - تنظیم NoCount در:

با هر عبارت DML، SQL Server به دقت ما را به ما پیامی که حاوی تعداد سوابق پردازش شده است، به ما می دهد. این اطلاعات ممکن است در طول اشکال زدایی کد مفید باشد، اما بعد از آن کاملا بی فایده خواهد بود. تجویز کردن مجموعه NoCount، ما این ویژگی را خاموش می کنیم. برای روش های ذخیره شده حاوی عبارات متعدد یا چرخه ها این عمل این می تواند افزایش قابل توجهی در عملکرد را افزایش دهد، زیرا تعداد ترافیک به طور قابل توجهی کاهش می یابد.

Transact-SQL

از نام طرح به نام شیء استفاده کنید:

خوب، من فکر می کنم روشن است. این عملیات به سرور می گوید که در آن به دنبال اشیاء و به جای آن به طور تصادفی در ظروف خود به طور تصادفی تکان می خورد، بلافاصله می داند کجا باید برود و چه باید بکنید. با تعداد زیادی از پایگاه های داده، جداول و روش های ذخیره شده، می تواند زمان و اعصاب ما را به طور قابل توجهی ذخیره کند.

Transact-SQL

SELECT * از DBO.MYTABLE - این چگونگی انجام این کار را به خوبی انجام دهید - به جای انتخاب * از MyTable - و بنابراین بد - عمل DBO.MBOCROC عمل خوب است - یکی خوب است - به خصوص exec myproc.

از پیشوند "sp_" به نام روش های ذخیره شده خود استفاده نکنید:

اگر نام روش ما با SP_ شروع می شود، SQL Server برای اولین بار در پایگاه داده اصلی خود جستجو خواهد شد. واقعیت این است که این پیشوند برای سرورهای شخصی شخصی مورد استفاده قرار می گیرد. بنابراین، استفاده از آن می تواند منجر به هزینه های اضافی و حتی نتیجه نادرست شود، اگر روش با همان نام شما در پایه آن یافت شده است.

استفاده از اگر وجود داشته باشد (انتخاب 1) به جای آن اگر وجود داشته باشد (SELECT *):

برای بررسی در دسترس بودن ورود به یک جدول دیگر، ما از بیان موجود استفاده می کنیم. این عبارت درست می شود اگر یکی از بیان داخلی حداقل یک جمله را بازگرداند، مهم نیست "1"، همه سخنرانان یا جدول. داده های تشخیصی، در اصل استفاده نمی شود. بنابراین، برای فشرده سازی ترافیک در هنگام انتقال داده، منطقی تر از استفاده از "1"، همانطور که در زیر نشان داده شده است.

برای برنامه نویسی پیشرفته روش های ذخیره شده مایکروسافت، ODS (سرویس Open Data) API مجموعه ای از ماکروها و توابع مورد استفاده برای ساخت برنامه های سرور است که به شما امکان می دهد تا قابلیت های MS SQL Server 2000 را گسترش دهید.

روش های ذخیره شده ذخیره شده، ویژگی های معمول نوشته شده در C / C ++ با استفاده از ODS API و API های Win32، تزئین شده در قالب یک کتابخانه طرح پویا (DLL) و طراحی شده به عنوان من گفت، بهبود عملکرد سرورهای SQL. ODS API توسعه دهنده مجموعه ای غنی از توابع را فراهم می کند که به شما امکان انتقال داده ها را به مشتری دریافت شده از هر منبع داده خارجی (منبع داده) به صورت سوابق معمولی (رکورد مجموعه) می دهد. همچنین، روش ذخیره شده ذخیره شده می تواند مقادیر را از طریق پارامتر خروجی بازگرداند).

روش های ذخیره شده ذخیره شده چگونه کار می کنند.

  • هنگامی که برنامه مشتری باعث می شود یک روش ذخیره شده ذخیره شده، درخواست به فرمت TDS از طریق کتابخانه شبکه شبکه شبکه کتابخانه ها و سرویس داده باز MS SQL Server منتقل می شود.
  • SQL STRE یک کتابخانه مرتبط با DLL را با نام روش پیشرفته ذخیره شده پیدا می کند و اگر قبلا بارگذاری نشده باشد، آن را در زمینه آن بارگذاری می کند و باعث می شود یک روش ذخیره شده ذخیره شده به عنوان یک تابع در داخل DLL اجرا شود.
  • روش ذخیره شده توسعه یافته بر روی سرور اقدامات مورد نیاز خود را انجام می دهد و مجموعه ای از نتایج را به برنامه مشتری انتقال می دهد با استفاده از سرویس ارائه شده توسط API ODS.

ویژگی های روش های ذخیره شده پیشرفته.

  • روشهای ذخیره شده تمدید توابع در حال اجرا در MS SQL Server آدرس فضای و در زمینه امنیت حساب که در آن سرویس MS SQL Server در حال اجرا است؛
  • پس از اینکه کتابخانه DLL با روش های ذخیره سازی پیشرفته به حافظه بارگذاری شد، آن را باقی می ماند تا زمانی که SQL Server متوقف شود، یا تا زمانی که مدیر آن را به صورت اجباری با استفاده از دستور باز کند:
    dbcc dll_name (رایگان).
  • روش ذخیره شده ذخیره شده شروع به انجام همان کار معمولی ذخیره می کند:
    اجرای xp_extendedprocname @ param1، @ param2 خروجی
    @ پارامتر ورودی Param1
    @ پارامتر ورودی / خروجی Param2
توجه!
از آنجا که روش های ذخیره شده ذخیره شده در فضای آدرس سرویس سرور SQL MS SQL انجام می شود، هر گونه خطای حیاتی ناشی از کار آنها می تواند هسته سرور را تولید کند، بنابراین توصیه می شود قبل از نصب سرور کار، DLL خود را به دقت آزمایش کنید.

ایجاد روش های ذخیره شده ذخیره شده.

روش ذخیره شده ذخیره شده این ویژگی دارای نمونه اولیه زیر است:

srvretcode xp_extenderprocname (srvproc * psrvproc)؛

پارامتر psrvproc نشانه در ساختار SRVPROC است که توصیفگر (دسته) هر اتصال مشتری خاص است. زمینه های این ساختار بدون ثبت نام و کمک به اطلاعاتی که کتابخانه ODS برای مدیریت ارتباطات و داده ها از آن استفاده می کند کمک می کند برنامه سرور باز کردن خدمات داده خدمات سرور و مشتری. در هر صورت، شما نیازی به تماس با این ساختار نخواهید داشت و آن را تغییر دهید. این پارامتر مورد نیاز است برای مشخص کردن هر گونه عملکرد API ODS، بنابراین در آینده من در توضیحات خود متوقف نخواهم شد.
با استفاده از prefix XP_ اختیاری است، اما توافق برای شروع نام روش ذخیره شده ذخیره شده وجود دارد به شرح زیر است که تاکید بر تفاوت از روش معمول ذخیره شده، اسامی که، همانطور که می دانید، از پیشوند SP_ معمول است .
همچنین باید به یاد داشته باشید که نام روش های ذخیره شده ذخیره شده به ثبت نام حساس هستند. در مورد آن را فراموش نکنید زمانی که شما یک روش ذخیره شده ذخیره شده را فراخوانی کنید، در غیر این صورت به جای نتیجه مورد انتظار، یک پیام خطا دریافت خواهید کرد.
اگر شما نیاز به نوشتن کد اولیه DLL / deinitialization، از استاندارد استاندارد Dllmain () استفاده کنید. اگر شما چنین نیازی ندارید، و شما نمی خواهید Dllmain را بنویسید ()، کامپایلر نسخه خود را از عملکرد Dllmain () جمع آوری می کند، که هیچ کاری انجام نمی دهد، اما به سادگی درست می شود. تمام توابع ناشی از DLL (I.E. روش های ذخیره شده ذخیره شده) باید به عنوان صادر شده اعلام شود. اگر شما در MS Visual C ++ بنویسید، از این دستورالعمل استفاده کنید __DECLSPEC (Dllexport). اگر کامپایلر شما این دستورالعمل را پشتیبانی نمی کند، عملکرد صادرات را در بخش صادرات در فایل DEF توصیف کنید.
بنابراین، برای ایجاد یک پروژه، ما به فایل های زیر نیاز داریم:

  • فایل header srv.h، شامل توصیف ویژگی ها و Macros ODS API؛
  • opends60.Lib فایل واردات کتابخانه opends60.dll، که کل خدمات ارائه شده توسط ODS API را اجرا می کند.
مایکروسافت به شدت توصیه می کند که تمام کتابخانه های DLL پیاده سازی روش های ذخیره شده ذخیره شده را اجرا کنند:

DCLSPEC (Dllexport) Ulong __getxpversion ()
{
بازگشت ODS_Version؛
}

هنگامی که MS SQL Server بارگذاری DLL C را بارگیری کرد، ابتدا این ویژگی را برای دریافت نسخه کتابخانه مورد استفاده قرار می دهد.

برای نوشتن اولین روش ذخیره شده ذخیره شده خود، باید بر روی کامپیوتر خود نصب کنید:

MS SQL Server 2000 هر ویرایشگر (من آن را دارم نسخه شخصی) در فرایند نصب، مطمئن شوید که گزینه منبع منبع را انتخاب کنید
- MS Visual C ++ (من از نسخه 7.0 استفاده کردم)، اما من مطمئن هستم و 6.0

نصب SQL Server -A برای آزمایش و اشکال زدایی DLL شما مورد نیاز است. اشکال زدایی احتمالی بر روی شبکه، اما من هرگز آن را انجام ندادم، و بنابراین همه چیز را بر روی خودم نصب کردم دیسک محلی. در تحویل مایکروسافت ویژوال Visual C ++ 7.0 ویراستاران Interprise Edition وارد عملیات ذخیره شده DLL Wizard می شوند. در اصل، این کار را بر روی طبیعی انجام نمی دهد، اما تنها یک قالب خالی از یک روش ذخیره شده ذخیره شده تولید می کند. اگر دوست دارید جادوگر، می توانید از آن استفاده کنید. من ترجیح می دهم همه چیز را با دسته ها انجام دهم، و بنابراین من این مورد را در نظر نمی گیرم.

در حال حاضر به مورد:
- اجرای ویژوال C ++ و ایجاد یک پروژه جدید - Win32 Link Link Link.
- فایل پیش نویس هدر را روشن کنید - #include ;
- برو به Tools \u003d\u003e گزینه های منو و اضافه کردن شامل مسیرهای جستجوی فایل های کتابخانه. اگر، هنگام نصب MS SQL Server، شما چیزی را تغییر ندهید، سپس مشخص کنید:

C: برنامه فایل MicroSoft SQL Server80toolsdevtoolsinclude for header files؛
- C: برنامه فایل Microsoft SQL Server80ToolsDevtoolsLib برای فایل های کتابخانه.
- نام فایل کتابخانه opends60.Lib را در گزینه های لینکر مشخص کنید.

این مرحله آماده سازی تکمیل شده است، شما می توانید اولین روش ذخیره شده خود را شروع کنید.

فرمول بندی مشکل

قبل از ادامه دادن به برنامه نویسی، لازم است به وضوح نمایانگر از کجا شروع شود، چه نتیجه باید نتیجه نهایی باشد، و نحوه رسیدن به آن. بنابراین، در اینجا کار فنی است:

یک روش ذخیره شده ذخیره شده برای MS SQL Server 2000، دریافت کنید که دریافت می کند فهرست کامل کاربران ثبت شده در دامنه، و آن را به مشتری به صورت یک مجموعه استاندارد از سوابق (رکورد مجموعه) بازگشت. به عنوان اولین پارامتر ورودی، تابع نام سرور حاوی پایگاه داده دایرکتوری را دریافت می کند ( دایرکتوری فعال)، یعنی نام کنترل کننده دامنه. اگر این پارامتر صفر باشد، باید مشتری را لیستی از گروه های محلی ارسال کنید. پارامتر دوم با استفاده از روش ذخیره شده ذخیره شده برای گسترش ارزش نتیجه موفقیت آمیز / ناموفق (پارامتر خروجی) استفاده می شود. اگر، روش ذخیره شده ذخیره شده موفقیت آمیز است، پس شما نیاز به انتقال تعداد سوابق به مجموعه مشتری، اگر اطلاعات مورد نیاز را نمی توان در طول عملیات به دست آورد، مقدار پارامتر دوم باید در -1 نصب شود، به عنوان یک نشانه ای از تکمیل ناموفق.

نمونه اولیه شرطی از روش ذخیره شده ذخیره شده به شرح زیر است:

xp_getuserlist (nameserver varchar، خروجی Countrec int)؛


اما قالب عملیات ذخیره شده را گسترش داد، که ما باید محتوای را پر کنیم:

#عبارتند از.
#عبارتند از.
#define xp_noError 0.
#define xp_error -1.


__DECLSPEC (DLExport) ServretCode XP_GETGROUPLIST (SRVPROC * PSRVPROC)
{

// تعداد پارامترهای انتقال را بررسی کنید

// نوع پارامترهای انتقال را بررسی کنید

// بررسی کنید که پارامتر خروجی پارامتر 2

// چک کنید، آیا پارامتر 2 طول کافی برای صرفه جویی در ارزش دارد

// پارامترهای ورودی دریافت کنید

// لیستی از کاربران را دریافت کنید

// ارسال داده های دریافت شده به مشتری به صورت یک مجموعه ضبط استاندارد (ضبط مجموعه)

// مقدار پارامتر خروجی را تنظیم کنید

بازگشت (xp_noError)؛
}


کار با پارامترهای ورودی

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

اولین اقدام که روش ذخیره شده ما را انجام می دهد باید برآورده شود این است که پارامترهایی را که هنگام تماس به آن منتقل شده اند، دریافت کنیم. پس از الگوریتم داده شده در بالا، ما باید اقدامات زیر را انجام دهیم:

تعیین تعداد پارامترهای منتقل شده؛
- اطمینان حاصل کنید که پارامترهای منتقل شده دارای نوع داده صحیح هستند؛
- اطمینان حاصل کنید که پارامتر خروجی مشخص شده طول کافی دارد، برای صرفه جویی در مقادیر بازگشتی به روش ذخیره شده ما ذخیره شده است.
- پارامترهای انتقال را دریافت کنید
- مقادیر خروجی را به عنوان نتیجه تکمیل موفقیت آمیز / ناموفق از روش ذخیره شده ذخیره شده تنظیم کنید.

در حال حاضر جزئیات هر مورد را در نظر بگیرید:

تعیین مقدار پارامترهای منتقل شده به روش ذخیره شده ذخیره شده

برای به دست آوردن تعداد پارامترهای منتقل شده، باید از تابع استفاده کنید:

int srv_rpcparams (srv_proc * srvproc)؛


پس از اتمام موفقیت آمیز، عملکرد تعداد پارامترهای منتقل شده به روش پیشرفته ذخیره شده را باز می گرداند. اگر روش ذخیره شده ذخیره شده بدون پارامترها نامیده می شود - srv_rpcParams منجر به -1 می شود. پارامترها را می توان با نام یا موقعیت (نامعلوم) منتقل کرد. در هر صورت، این دو راه را نمی توان مخلوط کرد. تلاش برای انتقال به عملکرد پارامترهای ورودی به نام و با موقعیت در همان زمان - منجر به خطا می شود، و srv_rpcparams بازگشت 0.

تعیین نوع داده ها و طول پارامترهای انتقال

برای اطلاعات در مورد نوع و طول پارامترهای مایکروسافت منتقل شده، توصیه می شود با استفاده از تابع srv_paramifo. این تابع جهانی جایگزین تماس srv_paramtype، srv_paramlen، srv_parammaxlen، که در حال حاضر در نظر گرفته شده است منسوخ شده است. در اینجا نمونه اولیه آن است:

int srv_paraminfo (
srv_proc * srvproc،
int n
بایت * PBTYPE،
ulong * pcbmaxlen،
ulong * pcbactuallen،
بایت * PBDATA،
bool * pfnull)؛

پیبری اشاره گر به متغیر دریافت اطلاعات در مورد نوع پارامتر ورودی؛
pbtype تعداد توالی پارامتر را مشخص می کند. اولین شماره پارامتر با 1 شروع می شود.
pcbmaxlen. اشاره گر به متغیر که در آن تابع وارد حداکثر مقدار طول پارامتر می شود. این مقدار به دلیل نوع خاصی از پارامتر انتقال داده شده است، ما از آن استفاده خواهیم کرد تا اطمینان حاصل کنیم که پارامتر خروجی طول کافی برای ذخیره داده های منتقل شده دارد.
pcbactuallen اشارهگر به طول واقعی پارامتر منتقل شده به روش پیشرفته ذخیره شده در هنگام فراخوانی. اگر پارامتر انتقال طول صفر داشته باشد، پرچم Pfnull به FALSE (* PCBactuAllen) \u003d\u003d 0 تنظیم شده است.
pbdata - اشاره گر به بافر، حافظه که باید قبل از تماس srv_paraminfo برجسته شود. در این بافر، ویژگی ها پارامترهای ورودی دریافت شده از روش ذخیره شده ذخیره شده را تعیین می کند. اندازه بافر در بایت برابر با ارزش PCBMaxlen است. اگر این پارامتر به null تنظیم شود، داده ها به بافر ضبط نشده است، اما عملکرد به درستی مقادیر * PBType، * PCBMaxlen، * PCBactuallen، * Pfnull را باز می کند. بنابراین، لازم است که تماس srv_paraminfo دو بار: ابتدا با pbdata \u003d null، و سپس برجسته کردن اندازه حافظه مورد نیاز برای یک بافر برابر PCBactuAllen، تماس دوم SRV_Paraminfo دوم، عبور به اشاره گر PBDATA به بلوک حافظه انتخاب شده.
pfnull اشاره گر به پرچم صفر srv_paraminfo اگر مقدار پارامتر ورودی صفر باشد، آن را درست تنظیم می کند.

بررسی کنید که آیا خروجی پارامتر دوم پارامتر است یا خیر.

تابع srv_paramstatus () برای تعیین وضعیت پارامتر منتقل شده طراحی شده است:

int srv_paramstatus (
srv_proc * srvproc،
int n.
);

n تعداد پارامتر منتقل شده به روش ذخیره شده ذخیره شده در هنگام فراخوانی. اجازه بدهید به شما یادآوری کنم: پارامترها همیشه از 1 عدد هستند.
برای بازگشت مقدار، srv_paramstatus از صفر بیت استفاده می کند. اگر آن را به 1 تنظیم شده است، پارامتر انتقال یک پارامتر خروجی است اگر در 0 پارامتر معمول منتقل شده توسط مقدار. اگر، روش ذخیره شده ذخیره شده بدون پارامتر نامیده شد، تابع بازگشت -1.

مقدار پارامتر خروجی را تنظیم کنید.

پارامتر خروجی منتقل شده به ذخیره شده ذخیره شده را می توان با استفاده از تابع srv_paramsetutput منتقل کرد. این خصوصیت جدید جایگزین تابع تابع srv_paramset، که در حال حاضر در نظر گرفته شده است قدیمی است، چرا که از انواع داده های جدید وارد شده در API ODS و داده های طول صفر پشتیبانی نمی کند.

int srv_paramsetutput (
srv_proc * srvproc،
int n
بایت * PBDATA،
کبل اولونگ،
bool fnull
);

n. تعداد دنباله ای از پارامتر که ارزش جدید آن تعیین می شود. این باید پارامتر خروجی باشد.
pbdata اشاره گر به بافر با داده ای که به مشتری ارسال می شود تا مقدار پارامتر خروجی را تنظیم کند.
cLBEN طول بافر داده ارسال شده است. اگر نوع داده از پارامتر خروجی انتقال داده ها داده ها از طول ثابت را تعیین می کند و اجازه ذخیره مقدار صفر (به عنوان مثال، srvbit یا srvint1) را اجازه نمی دهد، سپس تابع پارامتر Clen را نادیده می گیرد. مقدار Clen \u003d 0 نشان دهنده داده های طول صفر است، در حالی که پارامتر FNULL باید در اشتباه نصب شود.
فوم اگر پارامتر بازگشتی باید اختصاص داده شود، این را درست کنید ارزش صفرعلاوه بر این، مقدار CLEN باید 0 باشد، در غیر این صورت تابع با یک خطا تکمیل می شود. در همه موارد دیگر fnull \u003d false.
در صورت تکمیل موفقیت آمیز، عملکرد به دست می آید. اگر مقدار بازگشتی شکست خورده باشد، چالش ناموفق بود. همه چیز ساده و قابل فهم است
حالا ما به اندازه کافی می دانیم تا اولین روش پیشرفته ذخیره شده خود را بنویسیم، که مقدار را از طریق پارامتر منتقل شده به آن بازگرداند. اجازه دهید سنت موجود، این یک ردیف از جهان سلام خواهد بود! نسخه DeBuginal از مثال می تواند در اینجا دانلود شود.

#عبارتند از.

#define xp_noError 0.
#define xp_error 1.

#define max_server_error 20000.
#define xp_hello_error max_server_error + 1

void Printerror (srv_proc *، char *)؛

#IFDEF __CPLUSPLUS.
extern "c" (
#endif

srvretcode __DECLSPEC (Dllexport) XP_Helloworld (SRV_PROC * PSRVPROC)؛

#IFDEF __CPLUSPLUS.
}
#endif

srvretcode xp_helloworld (srv_proc * psrvproc)
{
char sztext \u003d "سلام جهان!"؛
بایت Btype؛
ulong cbmaxlen؛
ulong cbactuallen؛
Bool Fnull؛

/ * تعیین مقادیر منتقل شده به ذخیره شده ذخیره شده
روش پارامتر * /
اگر (srv_rpcparams (psrvproc)! \u003d 1)
{
Printerror (PSRVPROC، "مقدار مناسب پارامترها نیست!")؛
بازگشت (xp_error)؛
}

/ * دریافت اطلاعات در مورد نوع داده و طول پارامترهای انتقال * /
اگر (srv_paraminfo (psrvproc، 1، & btype، و cbmaxlen،
& cbactuallen، null، & fnull) \u003d\u003d fail)
{
Printerror (PSRVPROC،
"اطلاعات مربوط به پارامترهای ورودی امکان پذیر نیست ...")؛
بازگشت (xp_error)؛
}

/ * ما بررسی می کنیم که آیا پارامتر خروجی انتقال اختیاری است * /
اگر ((srv_paramstatus (psrvproc، 1) و srv_paramreturn) \u003d\u003d شکست)
{
Printerror (PSRVPROC،
"پارامتر منتقل شده پارامتر خروجی نیست!")؛
بازگشت (xp_error)؛
}

/ * نوع داده پارامتر منتقل شده را بررسی کنید * /
اگر (btype \u003d srvbigvarchar && btype! \u003d srvbigchar)
{
Printerror (PSRVPROC، "نه نوع مناسب پارامتر منتقل شده!")؛
بازگشت (xp_error)؛
}

/ * اطمینان حاصل کنید که پارامتر منتقل شده طول کافی برای ذخیره خط بازگشت * /
اگر (cbmaxlen.< strlen(szText))
{
Printerror (PSRVPROC،
"پارامتر طول کافی برای صرفه جویی در خط بازگشت نیست!")؛
بازگشت (xp_error)؛
}

/ * ما مقدار پارامتر خروجی را تنظیم می کنیم * /
اگر (fail \u003d\u003d srv_Paramsetutut (PSRVPROC، 1، BYTE *) SZTEXT، 13، FALSE))
{
Printerror (PSRVPROC،
"من نمی توانم مقدار پارامتر خروجی را تنظیم کنم ...")؛
بازگشت (xp_error)؛
}

srv_senddone (psrvproc، srv_done_count | srv_done_more)، 0، 1)؛
بازگشت (xp_noError)؛
}

void printerror (srv_proc * psrvproc، char * szerrormsg)
{
srv_sendmsg (psrvproc، srv_msg_error، xp_hello_error، srv_info، 1،
null، 0، 0، szerrormsg، srv_nullterm)؛

srv_senddone (psrvproc، (srv_done_error | srv_done_more)، 0، 0)؛
}

تابع srv_sendmsg و srv_senddone در نظر گرفته نشده است. تابع srv_sendmsg برای ارسال پیام به مشتری استفاده می شود. در اینجا نمونه اولیه آن است:

int srv_sendmsg (
srv_proc * srvproc،
int msgtype
dbint msgnum،
کلاس Dbtinyint،
دولت Dbtinyint
dbchar * rpcname
int rpCnamelen،
Linenum Dbusmallint
پیام DBCHAR *
int msglen
);

msgtype نوع پیام ارسال شده به مشتری را تعریف می کند. ثابت SRV_MSG_INFO یک پیام اطلاعاتی را نشان می دهد و پیام خطای srv_msg_errror را نشان می دهد؛
شماره پیام MSGNUM؛
کلاس - شدت خطا رخ داده است. پیام های اطلاعاتی از اهمیت گرانش کوچکتر یا برابر 10 برابر است.
دولت شماره خطا برای پیام فعلی این پارامتر اطلاعاتی در مورد زمینه خطا ارائه می دهد. ارزش های معتبر دروغ گفتن در محدوده 0 تا 127؛
rPCNAME در حال حاضر استفاده نشده است
rpCnamelen - در حال حاضر استفاده نشده است؛
لندنوم در اینجا شما می توانید شماره خط کد منبع را مشخص کنید. با توجه به این مقدار، نصب آسان خواهد بود در چه جایی خطایی رخ داده است. اگر نمی خواهید از این فرصت استفاده کنید، سپس لینوم را در 0 نصب کنید؛
اشاره گر پیام به رشته ارسال شده به مشتری؛
msglen طول رشته های رشته پیام را تعیین می کند. اگر این رشته با یک نماد صفر به پایان می رسد، مقدار این پارامتر را می توان به srv_nullterm تنظیم کرد.
ارزش بازگشت:
- در مورد موفقیت موفقیت
- اگر شکست خورده باشد

در طول عملیات، روش ذخیره شده ذخیره شده باید به طور منظم وضعیت خود را به برنامه مشتری گزارش دهد، I.E. ارسال پیام ها در مورد اقدامات انجام شده. برای این منظور، عملکرد srv_senddone در نظر گرفته شده است:

int srv_senddone (
srv_proc * srvproc،
وضعیت Dbusmallint،
اطلاعات dbusmallint،
شمارش dbint
);

پرچم وضعیت وضعیت مقدار این پارامتر را می توان با استفاده از منطقی و یا اظهارات برای ترکیب ثابت های جدول زیر تنظیم کرد:
وضعیت پرچم شرح
SRV_DONE_FINAL مجموعه فعلی نتایج نهایی است؛
srv_done_more مجموعه ای از نتایج فعلی نهایی نیست، باید یک بخش محوری از داده ها را انتظار داشته باشید؛
srv_done_count Parameter Count شامل درست است
srv_done_error برای اطلاع از وقوع خطاها و تکمیل فوری مورد استفاده قرار می گیرد.
به رزرو شده، لازم است که در 0 نصب شود.
تعداد مجموعه داده های حاصل شده به مشتری را شمارش کنید. اگر پرچم وضعیت به srv_done_count تنظیم شود، تعداد باید تعداد صحیح ضبط شده توسط مشتری را داشته باشد.
ارزش بازگشت:
- در مورد موفقیت موفقیت
- اگر شکست خورده باشد

نصب روش های ذخیره شده پیشرفته در MS SQL Server 2000

1. کتابخانه DLL را با یک روش ذخیره شده ذخیره شده در دایرکتوری Binn با دستگاه با MS SQL Server نصب کنید. من این مسیر را دنبال می کنم: C: برنامه فایل Microsoft SQL Servermssqlbinn؛
2. با پیروی از اسکریپت زیر، یک روش ذخیره شده ذخیره شده را در سرور ثبت کنید:

استفاده از استاد
اجرای sp_addextendproc xp_helloworld، xp_helloworld.dll

تست عملیات xp_helloworld را با اجرای چنین اسکریپت انجام دهید:

اعلام param varchar (33)
اجرای XP_HelloworldParam Output
param را به عنوان output_Param انتخاب کنید


نتیجه

در این قسمت اول مقاله من کامل شده است. حالا من مطمئن هستم که شما آماده هستید تا با ما کنار بیایید وظیفه فنی 100٪ در مقاله بعدی شما یاد خواهید گرفت:
- نوع داده ها در API ODS تعریف شده است؛
- ویژگی های اشکال زدایی پاستای ذخیره شده ذخیره شده؛
- نحوه تولید RecordSet-S و انتقال آنها به برنامه مشتری؛
- در نظر می گیری، ما به توابع API پیمایش شبکه فعال دایرکتوری لازم برای به دست آوردن لیستی از کاربران دامنه نگاه خواهیم کرد.
- ایجاد یک پروژه به پایان رسید (ما اجرای کار فنی ما)
امیدوارم - به اورژانس!

PS: مثال فایل ها برای مقاله Studio 7.0

  1. بررسی اپراتورهای توصیف روش های ذخیره شده و اصول انتقال پارامترهای ورودی و خروجی خود را بررسی کنید.
  2. روش برای ایجاد و اشکال زدایی روش های ذخیره شده در سرور MS SQL Server 2000 را بررسی کنید.
  3. پنج روش اساسی ذخیره شده را توسعه دهید پایه علمی داده "کتابخانه".
  4. یک گزارش را در مورد کار انجام شده در فرم الکترونیکی آماده کنید.

1. اطلاعات عمومی در مورد روش های ذخیره شده

روش ذخیره شده (روش ذخیره شده) - این مجموعه ای از دستورات، ذخیره شده بر روی سرور است و به طور کلی اجرا می شود. روش های ذخیره شده مکانیسم ای است که شما می توانید زیرمجموعه هایی را که بر روی سرور اجرا می شود ایجاد کنید و توسط فرآیندهای آن کنترل شود. چنین زیرمجموعه ها را می توان با استفاده از درخواست آنها فعال کرد. علاوه بر این، آنها می توانند ناشی از قوانین باشند که از یکپارچگی داده ها پشتیبانی می کنند یا باعث می شود.

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

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

روش های ذخیره شده دو نوع هستند: طبیعی و تمدید شده. رویه های متعارف ذخیره شده مجموعه ای از دستورات در مورد Transact-SQL هستند، در حالی که روش های ذخیره شده ذخیره شده به عنوان کتابخانه های پویا (DLL) ارائه شده است. چنین رویه ها، در مقایسه با معمول، پیشوند XP_ دارند. سرور دارای مجموعه ای استاندارد از روش های پیشرفته است، اما کاربران می توانند روش های خود را در هر زبان برنامه نویسی بنویسند. نکته اصلی این است که از رابط برنامه نویسی استفاده کنید sql سرور باز API خدمات داده. روش های ذخیره شده ذخیره شده تنها می تواند در پایگاه داده اصلی باشد.

روشهای ذخیره شده متعارف نیز می تواند به دو نوع تقسیم شود: وابسته به سیستمیک و سفارشی. روش های سیستم - این است روش های استانداردخدمت به عملیات سرور؛ سفارشی - هر روش ایجاد شده توسط کاربر.

1.1. مزایای استفاده از روش های ذخیره شده

در موارد کلی، روش های ذخیره شده مزایای زیر را دارند:

  • عملکرد بالا این نتیجه محل روش های ذخیره شده در سرور است. سرور معمولا بیشتر است ماشین قدرتمند، بنابراین زمان اجرای روش بر روی سرور به طور قابل توجهی کمتر از آن است ایستگاه کاری. علاوه بر این، اطلاعات از پایگاه داده و روش ذخیره شده در همان سیستم قرار دارد، بنابراین انتقال سوابق بر روی شبکه عملا صرف نمی شود. روش های ذخیره شده دسترسی مستقیم به پایگاه های داده، که باعث می شود با اطلاعات بسیار سریع کار کند.
  • مزیت توسعه سیستم در معماری سرویس گیرنده سرور. این امکان به طور جداگانه ایجاد یک نرم افزار و سرور مشتری است. این مزیت کلیدی در توسعه است و به لطف آن شما می توانید زمان لازم برای پایان پروژه را به طور قابل توجهی کاهش دهید. کد در حال اجرا بر روی سرور می تواند به طور جداگانه از کد بخش مشتری توسعه داده شود. در این مورد، اجزای بخش سرور را می توان توسط اجزای طرف مشتری به اشتراک گذاشت.
  • سطح امنیتی روش های ذخیره شده می تواند به عنوان یک ابزار بهبود امنیت عمل کند. شما می توانید رویه های ذخیره شده ایجاد کنید که عملیات اضافه کردن، تغییر، حذف و نمایش لیست ها را انجام می دهند و بنابراین کنترل هر یک از جنبه های دسترسی به اطلاعات را به دست می آورند.
  • تقویت قوانین سرور کار با داده ها. این یکی از مهمترین علل استفاده از هسته پایگاه داده هوشمند است. روش های ذخیره شده به شما این امکان را می دهد که قوانین و منطق دیگری را اعمال کنید که به کنترل اطلاعاتی که به سیستم فعال می شود، کمک می کند.

اگر چه زبان SQL به عنوان یک نگرانی تعریف شده است، SQL Server از کلمات کلیدی مربوط به مدیریت اجرای روش استفاده می کند. چنین کلمات کلیدی هنگام ایجاد رویه هایی که می توانند برای اعدام بعدی ذخیره شوند استفاده می شود. روش های ذخیره شده را می توان به جای برنامه های ایجاد شده استفاده کرد زبان های استاندارد برنامه نویسی (به عنوان مثال، با یا ویژوال بیسیک) و انجام عملیات در پایگاه داده داده های SQL سرور

روشهای ذخیره شده در اولین اجرای کامپایل شده و در جدول سیستم پایگاه داده فعلی ذخیره می شوند. هنگام کامپایل، آنها بهینه شده اند. در این مورد، بهترین راه برای دسترسی به اطلاعات جدول انتخاب شده است. چنین بهینه سازی موقعیت واقعی داده ها را در جدول، شاخص های موجود، بار جدول، و غیره را در نظر می گیرد.

روشهای ذخیره شده جمع آوری شده می تواند به طور قابل توجهی بهبود عملکرد سیستم را بهبود بخشد. با این حال، ارزشش را دارد، با این حال، شایان ذکر است که آمار داده ها از لحظه ایجاد این روش تا زمانی که اعدام آن ممکن است منسوخ شود، و شاخص ها می توانند بی اثر شوند. و اگرچه شما می توانید آمار را ارتقا دهید و شاخص های جدید و کارآمدتر را اضافه کنید، طرح اجرای روش قبلا کامپایل شده است، یعنی این روش کامپایل شده است، و در نتیجه، روش دسترسی به داده ها می تواند موثر باشد. بنابراین، این امکان وجود دارد که رویه ها را با هر تماس بگیرید.

از سوی دیگر، بازپرداخت هر بار طول می کشد. بنابراین، مسئله اثربخشی بازپرداخت روش یا تلفیق یک بار پیاده سازی آن کاملا ظریف است و باید برای هر مورد خاص به طور جداگانه مورد توجه قرار گیرد.

روش های ذخیره شده را می توان در یک دستگاه محلی یا در یک سیستم SQL Server از راه دور انجام داد. این باعث می شود که فرایندها را بر روی ماشین های دیگر فعال کنید و نه تنها با پایگاه داده های محلی، بلکه همچنین با اطلاعات در مورد سرورهای مختلف کار کنید.

برنامه های کاربردی نوشته شده در یکی از زبان های سطح بالا، مانند با یا ویژوال بیسیک دات نت، همچنین می تواند روش های ذخیره شده را نیز ایجاد کند که تضمین می کند راه حل بهینه با توزیع بار بین بخش سرویس دهنده نرم افزار و SQL Server.

1.2 ایجاد روش های ذخیره شده

ایجاد دستورالعمل دستورالعمل برای ایجاد یک روش ذخیره شده اعمال می شود. نام روش ذخیره شده می تواند تا 128 کاراکتر طول داشته باشد، از جمله نمادها # و ##. نحو تعریف روش:

کیفیت نام را ایجاد کنید [؛ عدد]
[(@ parameter type_data) [\u003d value___uomolement]]] [، ... n]

مانند
<Инструкции_SQL>

پارامترهای این دستور را در نظر بگیرید:

  • نام: Procedure_name - نام روش؛ باید قوانین شناسه را برآورده کند: طول آن نمی تواند بیش از 128 کاراکتر باشد؛ برای روش های محلی محلی، نام قبل از نام، و برای روش های موقت جهانی استفاده می شود - نشانه ها ##؛
  • این عدد یک عدد صحیح اختیاری است که برای گروه بندی چندین روش تحت یک نام استفاده می شود؛
  • @ Parameter type_data - لیستی از نام پارامتر روش نشان دهنده نوع داده مناسب برای هر یک؛ چنین پارامترها می تواند تا 2100 باشد. مقدار پارامتر مجاز به انتقال صفر است. تمام انواع داده ها را می توان به استثنای متن، ntext و انواع تصویر استفاده کرد. شما می توانید نوع داده های مکان نما را به عنوان پارامتر خروجی (خروجی کلمه کلیدی یا تغییر) استفاده کنید. پارامترهای داده های مکان نما می توانند تنها پارامترهای خروجی باشند؛
  • تغییر یک کلمه کلیدی است که تعیین می کند که پارامتر حاصل از آن به عنوان پارامتر نتیجه استفاده می شود (فقط برای نوع مکان نما استفاده می شود)؛
  • خروجی - پیشنهاد می کند که پارامتر مشخص شده را می توان به عنوان یک خروجی استفاده کرد.
  • value_to_ux - مورد استفاده در مورد زمانی که تماس با روش، پارامتر از دست رفته؛ باید یک ثابت باشد و ممکن است شامل کاراکترهای ماسک (٪، _، [،]، ^) و مقدار صفر باشد؛
  • با recompile - کلمات کلیدی نشان می دهد که SQL Server برنامه روش را در حافظه پنهان ثبت نمی کند و هر بار که اجرا می شود، آن را ایجاد می کند؛
  • با رمزگذاری - کلمات کلیدی نشان می دهد که SQL Server این روش را قبل از نوشتن به جدول سیستم SysComments رمزگذاری می کند. به منظور متن از روش های رمزگذاری شده برای بازگرداندن، لازم است که کورتیک ها را از جداول Syscomments مربوط به آنها پس از رمزگذاری حذف کنید؛
  • برای تکرار - کلمات کلیدی نشان می دهد که این روش فقط برای تکرار ایجاد می شود. این گزینه با کلمات کلیدی با بازپرداخت ناسازگار است؛
  • به عنوان - آغاز تعریف متن روش؛
  • <Инструкции_SQL> - تنظیم دستورالعمل های مجاز SQL، تنها با حداکثر اندازه روش ذخیره شده محدود شده است - 128 کیلوبایت. نامعتبر اپراتورهای زیر هستند: تغییر پایگاه داده، روش تغییر، تغییر جدول، ایجاد پیش فرض، ایجاد روش، تغییر مسیر، ایجاد پایگاه داده، ایجاد قانون، ایجاد طرح، ایجاد ماشه، ایجاد دیجیتال، دیسک تغییر اندازه، دیسک تغییر دهید ، قطره به طور پیش فرض، روش رها کردن، کاهش قانون، رها کردن ماشه، Drop Trigger، Drop View، Resotre پایگاه داده، بازگرداندن ورود، تنظیم مجدد، آمار به روز رسانی.

یک نمونه از روش ذخیره شده را در نظر بگیرید. ما یک روش ذخیره شده را توسعه خواهیم داد که تعداد کپی کتاب هایی را که در حال حاضر در کتابخانه هستند، نمایش می دهد:

ایجاد روش count_ex1.
- روش شمارش تعداد نسخه های کتاب
- در حال حاضر در کتابخانه،
- نه بر روی خوانندگان دست
مانند
- متغیر محلی موقت را تنظیم کنید
اعلام int int
s را انتخاب کنید n \u003d count (*) از نمونه ای که yes_no \u003d "1"
s را انتخاب کنید
برو

از آنجا که روش ذخیره شده یک مولفه پایگاه داده کامل است، چگونه شما قبلا درک کرده اید، می توانید یک روش جدید برای پایگاه داده فعلی ایجاد کنید. هنگام کار در تجزیه و تحلیل پرس و جو SQL Server، تنظیم پایگاه داده فعلی با استفاده از اپراتور استفاده می شود، به دنبال آن نام پایگاه داده که در آن روش ذخیره شده باید ایجاد شود. همچنین پایگاه داده فعلی را نیز می توانید با استفاده از لیست کشویی استفاده کنید.

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

SQL Server 2000 از نامگذاری شده به نام نامگذاری شده به نام نامگذاری نام نامگذاری نام نامگذاری شده استفاده می کند، بنابراین اگر روش ذخیره شده حاوی تجدید نظر به دیگری باشد، هنوز یک روش اجرا نشده است، هشدار نمایش داده می شود، اما تماس با روش غیر موجود حفظ می شود.

اگر سیستم را با یک روش ذخیره نشده نامشخص بگذارید، در حالی که سعی می کنید آن را اجرا کنید، کاربر یک پیام خطا دریافت می کند.

شما همچنین می توانید یک روش ذخیره شده را با استفاده از SQL Server Enterprise Manager ایجاد کنید:

به منظور بررسی عملکرد روش ذخیره شده ذخیره شده، شما باید به تجزیه و تحلیل پرس و جو بروید و روش را برای اجرای اپراتور اجرا کنید exec<имя процедуры> . نتایج راه اندازی روش های ایجاد شده توسط ما در شکل ها ارائه شده است. چهار.

شکل. 4. اجرای روش ذخیره شده در تجزیه و تحلیل پرس و جو

شکل. 5. نتیجه روش بدون اپراتور خروجی بر روی صفحه نمایش

1.3. پارامترهای روش های ذخیره شده

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

  • برای این روش، می توانید یک یا چند پارامتر را تعریف کنید.
  • پارامترها به عنوان مکان های ذخیره سازی نامیده می شود، درست مانند متغیرها در زبان های برنامه نویسی مانند C، Visual Basic .NET.
  • نام پارامتر لزوما پیش از نماد @ است.
  • نام پارامتر محلی در این روش است که آنها تعریف می شوند.
  • پارامترها برای انتقال روش اطلاعات هنگام اجرای آن خدمت می کنند. آنها از B جلوگیری خواهند کرد خط فرمان پس از نام روش
  • اگر این روش دارای پارامترهای متعددی باشد، آنها توسط کاما جدا می شوند.
  • برای تعیین نوع اطلاعات منتقل شده به عنوان یک پارامتر، سیستم یا نوع داده های کاربر اعمال می شود.

در زیر تعریف یک روش دارای یک پارامتر ورودی است. وظیفه قبلی را تغییر دهید و ما تمام نسخه های کتاب را نمی پذیریم، بلکه تنها نمونه هایی از یک کتاب خاص است. این کتاب ها قطعا توسط ISBN منحصر به فرد شناسایی می شوند، بنابراین ما این پارامتر را به روش انتقال می دهیم. در این مورد، متن روش ذخیره شده تغییر خواهد کرد و فرم زیر را دارد:

ایجاد روش count_ex (insbn varchar (14))
مانند
اعلام int int
s را انتخاب کنید
برو

هنگامی که این روش را شروع می کنید، باید مقدار پارامتر ورودی را انتقال دهیم (شکل 6).

شکل. 6. اجرای روش با انتقال پارامتر

برای ایجاد نسخه های متعدد از همان روش که دارای همان نام هستند، نام اصلی را دنبال کنید تا یک semicolon و یک عدد صحیح قرار دهید. نحوه انجام این کار در مثال زیر نشان داده شده است، جایی که ایجاد دو روش با همان نام شرح داده شده است، اما با شماره های مختلف نسخه (1 و 2). این شماره برای کنترل نسخه این روش استفاده می شود. اگر شماره نسخه مشخص نشده باشد، اولین نسخه از روش انجام می شود. این گزینه در مثال قبلی نشان داده نشده است، اما، با این وجود، برای درخواست شما در دسترس است.

برای نمایش یک پیام شناسایی نسخه، هر دو روش دستورالعمل چاپ را اعمال می کنند. نسخه اول تعداد نمونه های آزاد را در نظر می گیرد و دوم تعداد نسخه های دست برای این کتاب است.

متن هر دو نسخه از روش های زیر است:

CREATURE COUNTCE_EX_ALL؛ یک
(insbn varchar (14))
- روش شمارش نسخه های رایگان کتاب داده شده
مانند
اعلام int int
را انتخاب کنید n \u003d count (*) از نمونه ای که iSBN \u003d bisbn و yes_no \u003d "1"
s را انتخاب کنید
--
برو
--
CREATURE COUNTCE_EX_ALL؛ 2
(insbn varchar (14))
- روش شمارش نسخه های رایگان کتاب داده شده
مانند
اعلام @ n1 int
@ n1 \u003d count (*) از نمونه ای که iSBN \u003d bisbn و yes_no \u003d "0" را انتخاب کنید
@ n1 را انتخاب کنید.
برو

نتایج حاصل از روش با نسخه های مختلف در شکل نشان داده شده است. 7

شکل. 7. نتایج را اجرا کنید نسخه های مختلف همان و روش مشابه ذخیره شده

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

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

کد مقدار
0 همه چیز خوب است
-1 جسم یافت نشد
-2 خطای نوع داده
-3 این فرایند قربانی "Deadlock" بود
-4 خطای دسترسی
-5 اشتباه نوشتاری
-6 برخی از خطا
-7 خطا با منابع (بدون مکان)
-8 یک خطای داخلی اصلاح شده وجود داشت
-9 محدودیت سیستم خسته شده است
-10 نقض نادرست یکپارچگی داخلی
-11 یکسان
-12 تخریب یک جدول یا شاخص
-13 تخریب پایگاه داده
-14 خطای تجهیزات

بنابراین به تناقض با سیستم، ما می توانیم تنها تعداد کل مثبت را از طریق این پارامتر بازگردانیم.

به عنوان مثال، ما می توانیم متن قبلا نوشته شده COUNT_EX را تغییر دهیم به شرح زیر است:

ایجاد روش count_ex2 (insbn varchar (14))
مانند
اعلام int int
n \u003d count (*) از نمونه را انتخاب کنید
جایی که isbn \u003d bisbn و yes_no \u003d "1"
- ارزش متغیر n را بازگردانید
- اگر مقدار متغیر تعریف نشده باشد، بازگشت 0
بازگشت coalesce (n، 0)
برو

حالا ما می توانیم مقدار متغیر n را دریافت کنیم و از آن برای پردازش بیشتر استفاده کنیم. در این مورد، مقدار بازگشتی به روش ذخیره شده ترین اختصاص داده شده است، و به منظور تجزیه و تحلیل آن، می توانید از فرمت بیانیه تماس زیر از روش ذخیره شده استفاده کنید:

exec<переменная> = <имя_процедуры> <значение_входных_параметров>

یک مثال از فراخوانی روش ما در شکل نشان داده شده است. هشت

شکل. 8. انتقال مقدار بازگشتی از روش ذخیره شده از متغیر محلی

پارامترهای ورودی روش های ذخیره شده می توانند از مقدار پیش فرض استفاده کنند. این مقدار مورد استفاده قرار می گیرد اگر مقدار پارامتر هنگام تماس با روش مشخص نشده باشد.

مقدار پیش فرض از طریق علامت برابر پس از توصیف پارامتر ورودی و نوع آن تنظیم می شود. روش ذخیره شده را در نظر بگیرید، که تعداد نسخه های کتاب های سال مشخص را در نظر می گیرد. سال توسعه به طور پیش فرض - 2006.

ایجاد روش ex_books_now (year int \u003d 2006)
- شمارش تعداد کپی کتاب های سال مشخص شده
مانند
declareN_books int
s را انتخاب کنید n_books \u003d تعداد (*) از کتاب ها، نمونه
جایی که books.isbn \u003d Exemplar.isbn و yearizd \u003d year
بازگشت coalesce (n_books، 0)
برو

در شکل 9 نمونه ای از فراخوانی این روش را نشان می دهد، نشان دهنده پارامتر ورودی و بدون آن است.

شکل. 9. تماس با روش ذخیره شده با پارامتر و بدون پارامتر

تمام نمونه های استفاده از پارامترها در روش های ذخیره شده ارائه شده فقط برای پارامترهای ورودی ارائه شده است. با این حال، پارامترها ممکن است خروجی باشند. این به این معنی است که ارزش پارامتر پس از اتمام این روش به کسی که موجب این روش (یک روش دیگر، یک ماشه، بسته بندی دستورات، و غیره)، به کسی منتقل می شود. به طور طبیعی، به منظور به دست آوردن پارامتر خروجی، زمانی که تماس باید مشخص شود به عنوان یک پارامتر واقعی ثابت نیست، اما یک متغیر است.

توجه داشته باشید که تعریف در روش پارامتر به عنوان خروجی شما را مجبور به استفاده از آن به عنوان چنین. به این ترتیب، اگر یک ثابت را به عنوان یک پارامتر واقعی مشخص کنید، خطاهای اتفاق نمی افتد و به عنوان یک پارامتر ورودی منظم استفاده می شود.

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

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

ایجاد PROCEDURE COUNT_BOOKS_ALL.
(isbn varchar (14)، خروجی int int، خروجی INFREE INT)
- روش محاسبه تعداد کل دفن زباله های کتاب داده شده
- و تعداد نمونه های رایگان
مانند
- شمارش تعداد کل نسخه ها
select@all \u003d count (*) از نمونه ای که isbn \u003d bysbn است
free \u003d count (*) را از نمونه ای که ISBN \u003d bysbn و yes_no \u003d "1" را انتخاب کنید
برو

یک نمونه از این روش در شکل نشان داده شده است. 10

شکل. 10. تست روش های ذخیره شده با پارامترهای خروجی

همانطور که قبلا ذکر شد، به منظور به دست آوردن ارزش پارامترهای خروجی برای تجزیه و تحلیل، ما باید آنها را با متغیرها تنظیم کنیم، و این متغیرها باید توسط اپراتور اعلام شود. آخرین اپراتور خروجی به ما اجازه داد به سادگی ارزش های به دست آمده را نمایش دهد.

پارامترهای این روش ممکن است حتی متغیرهای مکان نما را نیز داشته باشند. برای انجام این کار، متغیر باید به عنوان یک نوع خاص از داده های مختلف، بدون اتصال به نوع داده های استاندارد سیستم توصیف شود. علاوه بر این، باید مشخص شود که این یک مکان نما متغیر است.

ما ساده ترین روش را می نویسیم که لیستی از کتاب ها را در کتابخانه ما نمایش می دهد. در این مورد، اگر کتاب های بیشتری وجود نداشته باشد، ما نام خود را درون روش خود قرار می دهیم، و اگر لیست کتابها بیش از شماره مشخص شده باشد، ما آنها را به عنوان یک مکان نما با یک برنامه یا ماژول فراخوانی انتقال می دهیم.

متن روش به شرح زیر است:

ایجاد روش Get3Titles.
(MyCursor Cursor خروجی متفاوت)
- عناوین روش چاپ با مکان نما
مانند
- تعیین متغیر محلی نوع مکان نما در روش
set@mycursor \u003d cursor
برای انتخاب عنوان متمایز
از کتاب ها
- مکان نما را باز کنید
باز کردن mycursor.
- توصیف متغیرهای داخلی داخلی
اعلام Title varchar (80)، cnt int
--- وضعیت اولیه متر را نصب کنید
setcnt \u003d 0
- به رشته اول مکان نما بروید
- در حالی که رشته های مکان نما وجود دارد،
- این، در حالی که انتقال به رشته جدید درست
در حالی که (@ fetch_status \u003d 0) و (cnt<= 2) BEGIN
چاپ title
جمع آوری بعدی از mycursor inteTitle
- وضعیت متر را تغییر دهید
set cnt \u003d cnt + 1
پایان.
اگر cnt \u003d 0 چاپ "بدون کتاب های مناسب"
برو

یک مثال از فراخوانی این روش ذخیره شده در شکل نشان داده شده است. یازده

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

در پنجره خروجی، ما یک فاصله بزرگ را بین سه ردیف اول و نام های بعدی مشاهده می کنیم. این فاصله نشان می دهد که مدیریت به برنامه خارجی منتقل می شود.

توجه داشته باشید که متغیر Title، محلی برای روش، پس از اتمام عملیات آن نابود خواهد شد، بنابراین در روش فراخوانی دوباره اعلام می شود. ایجاد و باز کردن مکان نما در این مثال در روش رخ می دهد، و بسته شدن، تخریب، تخریب و پردازش اضافی در بلوک فرمان که در آن روش نامیده می شود انجام می شود.

ساده ترین راه برای دیدن متن روش، تغییر یا حذف آن با استفاده از رابط گرافیکی مدیریت شرکت سازمانی. اما شما می توانید این کار را با کمک سیستم ویژه ذخیره شده روشهای Transact-SQL انجام دهید. در Transact-SQL، مشاهده این روش با استفاده از روش سیستم SP_HELPTEXT انجام می شود و روش SP_HELP به شما امکان می دهد اطلاعات کنترل در مورد روش را نمایش دهید. روش های SP_Helptext و SP_HELP استفاده می شود و برای مشاهده چنین اشیاء پایگاه داده مانند جداول، قوانین و تنظیمات پیش فرض.

اطلاعات در مورد تمام نسخه های یک روش، صرف نظر از شماره، بلافاصله نمایش داده می شود. حذف نسخه های مختلف یک روش ذخیره شده نیز به طور همزمان رخ می دهد. در مثال زیر، نشان داده شده است که چگونه نسخه های 1 و 2 تعاریف COUNT_EX_ALL نمایش داده می شود زمانی که نام آن به عنوان پارامتر روش سیستم SP_HELPTEXT نشان داده شده است (شکل 12).

شکل. 12. مشاهده روش متن ذخیره شده با استفاده از روش ذخیره شده سیستم

روش SP_HELP ویژگی ها و پارامترهای روش ایجاد شده را به شرح زیر نشان می دهد:

نام.
مالک
نوع
ایجاد شده_datetime
count_books_all
dBO
روش ذخیره شده
2006-12-06 23:15:01.217
parameter_name
نوع
طول دقت
مقیاس Param_order Collation
isbn
varchar
14 14
خالی 1 cyrillic_general_ci_as.
@همه.
int
4 10
0 2 خالی
@رایگان
int
4 10
0 3 خالی

سعی کنید این پارامترها را خودتان رمزگشایی کنید. آنها راجع به چه چیزی صحبت میکنند؟

1.4 کامپایل روش ذخیره شده

مزیت استفاده از روش های ذخیره شده برای انجام دستورالعمل Transact-SQL این است که آنها در اولین اجرای آن کامپایل شده اند. در طول فرایند تلفیقی، دستورالعمل Transact-SQL از ارائه نمادین اولیه خود در فرم اجرایی تبدیل می شود. هر گونه اشیاء که درخواست تجدید نظر را نیز به یک دیدگاه جایگزین تبدیل می شود. به عنوان مثال، نام جداول به شناسه های شیء تبدیل می شود، و نام ستون در شناسه های ستون.

طرح اجرایی به همان شیوه ای برای اجرای یک دستور تراکنش-SQL ایجاد می شود. این طرح شامل، به عنوان مثال، شاخص های مورد استفاده برای خواندن ردیف از جداول که این روش کشیده شده است. طرح روش در حافظه پنهان ذخیره می شود و برای هر تماس استفاده می شود.

نکته: اندازه حافظه عملیاتی را می توان تعیین کرد به طوری که می تواند بیشتر یا همه در دسترس برای این روش باشد. این زمان مورد نیاز برای دوباره تولید یک طرح را ذخیره خواهد کرد.

1.5. تدوین خودکار خودکار

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

  • این روش همیشه زمانی که SQL Server شروع می شود، دوباره کامپایل می شود. این معمولا پس از راه اندازی مجدد سیستم عامل اتفاق می افتد و زمانی که این روش برای اولین بار پس از خلقت انجام می شود.
  • طرح روش همیشه به طور خودکار مجددا مجددا مجددا تنظیم می شود، اگر شاخص جدول حذف شود که کدام روش کشیده شده است. از آنجا که طرح فعلی به نظر می رسد ردیف جدول را به شاخص که دیگر وجود ندارد، بخوانید، باید یک طرح اجرایی جدید ایجاد کنید. درخواست های روش فقط اگر به روز شود، اجرا خواهد شد.
  • کامپایل برنامه اجرای در صورتی که کاربر دیگر در حال حاضر با این طرح کار می کند. برای کاربر دوم، یک کپی شخصی از طرح اجرای ایجاد شده است. اگر اولین نسخه از این طرح مشغول نیست، لازم نیست که یک کپی دوم ایجاد شود. هنگامی که یک کاربر اجرای این روش را تکمیل می کند، طرح اجرای در حافظه پنهان به کاربر دیگری که دارای وضوح دسترسی مناسب است، در دسترس است.
  • این روش به طور خودکار مجددا مجددا تنظیم می شود اگر حذف و به روز شود. از آنجا که روش جدید ممکن است از نسخه قدیمی متفاوت باشد، تمام نسخه های برنامه اجرایی در حافظه پنهان حذف می شوند و این طرح دوباره کامپایل شده است.

SQL Server به دنبال بهینه سازی روش های ذخیره شده با ذخیره کردن روش های شدید استفاده شده است. بنابراین، برنامه اعدام قدیمی بارگیری شده به حافظه پنهان می تواند به جای یک طرح جدید استفاده شود. برای جلوگیری از این مشکل، حذف و دوباره ایجاد یک روش ذخیره شده یا توقف و فعال کردن SQL Server. این حافظه پنهان را پاک می کند و احتمال کار با طرح اجرای قدیمی را حذف می کند.

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

اگر روش های مجدد کامپایل به طور خودکار تولید نمی شود، می توان آن را اجباری انجام داد. به عنوان مثال، اگر آمار مورد استفاده برای تعیین استفاده از شاخص در این پرس و جو باشد، یا اگر یک شاخص جدید ایجاد شده باشد، مجددا مجبور شده است. برای انجام مجددا مجددا مجددا در دستورالعمل اجرای مجدد، با پیشنهاد مجدد استفاده می شود:

اجرای name_names؛
مانند
<инструкции Transact-SQL>
با بازپرداخت

اگر این روش با پارامترهایی که روش اجرای آن را کنترل می کنند، باید با استفاده از گزینه بازپرداخت استفاده شود. اگر تنظیمات روش ذخیره شده می تواند بهترین مسیر اجرای را تعیین کند، توصیه می شود که در طول عملیات، یک طرح اجرایی را تشکیل دهید، نه اینکه آن را ایجاد کنید، تا زمانی که این روش برای اولین بار خواستار استفاده با تمام درخواست های بعدی باشد، توصیه می شود.

نکته: گاهی اوقات دشوار است که تعیین کنید که آیا گزینه های بازپس گیری در هنگام ایجاد یک روش ضروری است یا خیر. اگر شک و تردید وجود دارد، بهتر است که این گزینه را اعمال نکنید، زیرا روش کامپایل مجدد برای هر تکلیف منجر به از دست دادن یک زمان بسیار ارزشمند پردازنده مرکزی خواهد شد. اگر در هنگام انجام یک روش ذخیره شده نیاز به یک مجتمع مجدد در آینده دارید، ممکن است آن را با اضافه کردن پیشنهاد با تجدید نظر به دستورالعمل اجرا کنید.

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

1.6 روش های ذخیره شده ذخیره شده

در روش های ذخیره شده، دیگر روش های ذخیره شده را می توان به چالش کشیده، با این حال، محدودیت در سطح لانه سازی وجود دارد. حداکثر سطح لانه سازی 32 است. سطح لانه سازی فعلی را می توان با استفاده از یک متغیر جهانی nestlevel تعیین کرد.

2. ویژگی های تعریف شده توسط کاربر (UDF)

در MS SQL Server 2000، بسیاری از توابع پیش تعیین شده وجود دارد که اجازه می دهد تا اقدامات مختلف. با این حال، همیشه می توانید از برخی از توابع خاص استفاده کنید. برای انجام این کار، با شروع نسخه 8.0 (2000)، این فرصت را برای توصیف توابع کاربر (توابع تعریف شده توسط کاربر، UDF) و ذخیره آنها را به صورت یک شیء پایگاه داده کامل، همراه با روش های ذخیره شده، نمایندگی ها و غیره ذخیره می کند.

راحتی استفاده از توابع تعریف شده توسط کاربر واضح است. بر خلاف روش های ذخیره شده، توابع را می توان به طور مستقیم به بیانیه انتخابی تعبیه کرد و از آنها هر دو برای دریافت مقادیر خاص (در بخش انتخابی) و به عنوان یک منبع داده (در بخش از بخش) استفاده می شود.

هنگام استفاده از UDF به عنوان منابع داده، مزیت آنها بیش از نمایندگی ها در این واقعیت است که UDF، در مقایسه با دیدگاه ها، ممکن است پارامترهای ورودی داشته باشد که می توانید نتیجه عملکرد تابع را تحت تاثیر قرار دهید.

توابع تعریف شده توسط کاربر می تواند سه نوع باشد: توابع اسکالر, توابع درون خطی و توابع عملیاتی چندگانه که نتیجه جدول را نشان می دهند. تمام این نوع توابع را در نظر بگیرید.

2.1. توابع اسکالر

توابع اسکالر یک نتیجه اسکالر را باز می گرداند. این نتیجه می تواند هر نوع توضیح داده شده در بالا باشد، به استثنای متن، ntext، تصویر و نوع تایمز. این ساده ترین شکل تابع است. نحو آن فرم زیر را دارد:


scalar_typ_data را باز می گرداند

شروع.
body_function
بازگشت scalar_mapsion
پایان.

  • پارامتر رمزگذاری قبلا در بخش اختصاص داده شده به روش های ذخیره شده شرح داده شده است؛
  • Schemabinding - عملکرد را به نمودار متصل می کند. این به این معنی است که جداول یا نمایش ها را حذف کنید که بر اساس آن یک تابع مبتنی بر آن است، بدون حذف یا تغییر عملکرد خود. همچنین ممکن است ساختار این جداول را تغییر دهید، در صورتی که بخش متغیر توسط تابع استفاده شود. بنابراین، این گزینه به شما امکان می دهد شرایط را حذف کنید زمانی که تابع از هر جداول یا نمایش ها استفاده می کند، و کسی که در مورد آن نمی داند، آنها را حذف یا تغییر دهید؛
  • scalar_typ_data را باز می گرداند - توصیف نوع داده ای است که یک تابع را باز می گرداند؛
  • scalar_mapsia - بیان که به طور مستقیم نتیجه عملکرد را باز می کند. این باید همان نوع را که پس از بازگشت شرح داده شود، داشته باشد.
  • body_Function مجموعه ای از دستورالعمل های مربوط به Transact-SQL است.

نمونه هایی از استفاده از توابع اسکالر را در نظر بگیرید.

یک تابع را ایجاد کنید که از دو عدد صحیح به ورودی به شکل پارامترها، کوچکترین را انتخاب کنید.

اجازه دهید تابع به نظر می رسد این است:

ایجاد تابع min_num (ra int، bt، int)
بازپرداخت int
شروع.
اعلام @ int
اگر یک.< @b SET @c = @a
set @ b \u003d b \u003d b
بازگشت @
پایان.

ما اکنون این ویژگی را انجام خواهیم داد:

DBO.MIN_NUM را انتخاب کنید (4، 7)

در نتیجه، ما ارزش 4 را بدست آوریم.

شما می توانید این ویژگی را برای پیدا کردن کوچکترین در میان مقادیر ستون جدول اعمال کنید:

MIN_LVL، MAX_LVL، MIN_NUM (MIN_LVL، MAX_LVL) را انتخاب کنید
از مشاغل

یک تابع ایجاد کنید که پارامتر نوع DateTime را دریافت می کند و تاریخ و زمان مربوط به ابتدای روز مشخص شده را دریافت می کند. به عنوان مثال، اگر پارامتر ورودی 13:31 20/09/09 باشد، نتیجه خواهد شد 20.09.03 00:00.

ایجاد تابع dbo.daybegin (dat dateTime)
SmallDateTime را به عنوان باز می گرداند
شروع.
بازگشت تبدیل (DateTime، Floor (Convert (Float، DAT)))
پایان.

در اینجا، ویژگی تبدیل تبدیل نوع تبدیل را انجام می دهد. اول، نوع زمان تاریخ به وسیله نوع شناور هدایت می شود. با این پیشرو، کل بخش تعداد روز است، شمارش از 1 ژانویه 1900، و زمان کسری است. بعد به طور کامل با استفاده از عملکرد کف گرد می شود و به نوع زمان تاریخ تبدیل می شود.

تابع عمل را بررسی کنید:

DBO.DEBEGIN را انتخاب کنید (GetDate ())

در اینجا GetDate () یک تابع است که تاریخ و زمان فعلی را باز می گرداند.

در هنگام محاسبه پارامترهای ورودی استفاده شد. با این حال، شما می توانید از داده های ذخیره شده در پایگاه داده استفاده کنید.

ایجاد یک ویژگی که دو تاریخ را به عنوان پارامترها دریافت می کند: آغاز و پایان فاصله زمانی - و محاسبه درآمد کل فروش برای این فاصله. تاریخ فروش و مقدار از جدول فروش گرفته خواهد شد، و قیمت برای نسخه های فروخته شده در جدول عنوان است.

ایجاد تابع dbo.sumsales (datebegin dateTime، dateend dateTime)
پول را باز می گرداند
مانند
شروع.
اعلام پول SUM.
SELECT SUM \u003d SUM (T.PRICE * S.QTY)

بازگشت sum
پایان.

2.2. توابع درون خطی

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

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

ویژگی Fuccia درون خطی این است که آنها می توانند تنها یک درخواست را در بدن خود داشته باشند. بنابراین، توابع این نوع بسیار شبیه به دیدگاه ها هستند، اما آنها می توانند علاوه بر این پارامترهای ورودی داشته باشند. نحو عملکرد درون خطی:

عملکرد تابع [مالک] را ایجاد کنید
([[@ نام پارامتر SCALAR_TIP_DATA [\u003d value_p__omolement] [، ... n]])
جدول را باز می گرداند

برگشت [(<запрос>)]

در تعریف عملکرد نشان داده شده است که جدول را باز می کند؛<запрос> - این پرس و جو است، که نتیجه آن نتیجه عملکرد است.

ما یک تابع شبیه به یک تابع اسکالر را از آخرین نمونه نوشتیم، اما نه تنها نتیجه جمع آوری، بلکه خطوط فروش را نیز از جمله تاریخ فروش، نام کتاب، قیمت، تعداد قطعات و مقدار آن باز می گرداند فروش. تنها کسانی که در مدت زمان مشخصی قرار دارند باید انتخاب شوند. ما متن تابع را رمزگذاری می کنیم تا سایر کاربران بتوانند از آن استفاده کنند، اما نمی توانند آن را بخوانند و اصلاح کنند:

ایجاد تابع sales_period (dateBegin dateTime، dateend dateTime)
جدول را باز می گرداند
با رمزگذاری
مانند
برگشت (
T.Title، T.Price، S.QTY، ORD_DATE را انتخاب کنید، T.Price * S.QTY به عنوان Stoim
از عناوین T پیوستن به فروش S در t.title_id \u003d s.title_id
جایی که ord_date بین dateebegin و dateend
)

در حال حاضر این ویژگی را فراخوانی کنید. همانطور که قبلا ذکر شد، می توانید آن را فقط در بخش از اپراتور انتخاب کنید:

را انتخاب کنید * از sales_period ("09.09.94"، "13.09.94")

2.3. توابع عملیاتی چندگانه که نتیجه جدول را نشان می دهند

اولین نوع توابع در نظر گرفته شده، امکان استفاده از دستورالعمل های بسیاری در Transact-SQL وجود دارد، اما تنها یک نتیجه اسکالر بازگشت. نوع دوم توابع می تواند جداول را بازگرداند، اما بدن آن تنها یک درخواست را نشان می دهد. توابع چند نفره که نتیجه جدولی را باز می گرداند، به شما این امکان را می دهد که خواص دو توابع اول را ترکیب کنید، یعنی آنها ممکن است در بدن بسیاری از دستورالعمل های مربوط به Transact-SQL را شامل شود و یک جدول را به عنوان یک نتیجه برگرداند. نحو عملکرد چند منظوره:

عملکرد تابع [مالک] را ایجاد کنید
([[@ نام پارامتر SCALAR_TIP_DATA [\u003d value_p__omolement] [، ... n]])
بازگشت @ name_named_teult table
<описание_таблицы>

شروع.
<тело_функции>
برگشت.
پایان.

  • جدول<описание_таблицы> - ساختار جدول بازگشتی را توصیف می کند؛
  • <описание_таблицы> - شامل شمارش ستون ها و محدودیت ها است.

در حال حاضر یک مثال را در نظر بگیرید که تنها می تواند تنها با استفاده از توابع این نوع انجام شود.

اجازه دهید یک درخت دایرکتوری و فایل های دروغین در آنها وجود داشته باشد. اجازه دهید کل ساختار در پایگاه داده به صورت جداول توضیح داده شود (شکل 13). در واقع، در اینجا ما یک ساختار سلسله مراتبی برای دایرکتوری ها داریم، بنابراین طرح شامل اتصال جدول پوشه ها با خود است.

شکل. 13. ساختار پایگاه داده برای توصیف سلسله مراتب فایل ها و دایرکتوری ها

در حال حاضر یک تابع را بنویسید که شناسه دایرکتوری را در ورودی دریافت می کند و تمام فایل هایی را که در آن ذخیره می شوند و در تمام دایرکتوری ها در سلسله مراتب ذخیره می شوند، خروجی می کنند. به عنوان مثال، اگر کاتالوگ موسسه در کاتالوگ دانشکده 1، دانشکده 2 و غیره ایجاد شود، کاتالوگ های بخش وجود دارد، و در هر یک از دایرکتوری ها فایل ها وجود دارد، پس زمانی که پارامتر شناسه دایرکتوری را مشخص می کنید، موسسه باید لیستی از تمام فایل ها را برای تمام این کاتالوگ ها داشته باشد. برای هر فایل، نام، اندازه و تاریخ خلقت باید نمایش داده شود.

این کار با استفاده از توابع درون خطی غیرممکن است، زیرا SQL در نظر گرفته شده برای انجام پرسشهای سلسله مراتبی نیست، بنابراین یک درخواست SQL این کار را انجام نمی دهد. عملکرد اسکالر نیز نمی تواند اعمال شود، زیرا نتیجه باید یک جدول باشد. در اینجا ما باید کمک کنیم و یک تابع چند منظوره را که جدول را باز می گرداند کمک کنیم:

ایجاد تابع dbo.getfiles (folder_id int)
Returnsfiles Table (نام varchar (100)، Date_Create DateTime، FileSize Int) به عنوان
شروع.
اعلام جدول tmp (folder_id int)
اعلام cnt int
قرار دادن مقادیر tmp (folder_id)
set cnt \u003d 1
در حالی که cnt.<> 0 شروع
وارد 'tmp را انتخاب کنید folder_id
از پوشه ها F به F.Parent \u003d t.folder_id
جایی که folder_id از tmp) جایی که folder_id از
set cnt \u003d @ @ @ @
پایان.
وارد infiles (نام، date_create، فایل ها)
f.name، f.date_create را انتخاب کنید، f.filesize
از فایل های F پیوستن پوشه ها fl در f.folder_id \u003d fl.id
عضویت در tmp t در fl.id \u003d t.folder_id
برگشت.
پایان.

در اینجا در چرخه در متغیر tmp تمام دایرکتوری های پیوست شده را در تمام سطوح لانه سازی اضافه کنید تا زمانی که دایرکتوری های توپی باقی بمانند. سپس تمام ویژگی های فایل لازم در دایرکتوری های ذکر شده در متغیر tmp در متغیر infiles infiles ثبت می شود.

وظایف کار مستقل

شما باید پنج روش ذخیره شده را از لیست اجباری زیر ایجاد کنید و اشکال زدایی کنید:

روش 1. افزایش زمان تحویل نسخه های کتاب برای یک هفته اگر زمان تحویل فعلی در عرض سه روز قبل از تاریخ فعلی تا سه روز پس از تاریخ فعلی قرار گیرد.

روش 2. شمارش تعداد نمونه های رایگان یک کتاب داده شده.

روش 3. وجود خواننده را با نام خانوادگی مشخص و تاریخ تولد بررسی کنید.

روش 4. وارد کردن یک خواننده جدید با بررسی وجود آن در پایگاه داده و تعریف شماره بلیط جدید خواننده آن.

روش 5. شمارش خوب در شرایط پولی برای خوانندگان بدهکار.

شرح مختصری از روش ها

روش 1. افزایش کتاب

برای هر ورودی در جدول نمونه، بررسی می شود اگر تاریخ تحویل کتاب به یک فاصله زمانی داده می شود. اگر آن را بازدید، تاریخ بازگشت کتاب برای یک هفته افزایش می یابد. هنگام انجام این روش، باید از تابع تاریخ استفاده کنید:

Dateadd (روز،<число добавляемых дней>, <начальная дата>)

روش 2. شمارش تعداد نمونه های رایگان کتاب مشخص شده

پارامتر ورودی روش ISBN - یک رمز منحصر به فرد کتاب است. این روش 0 (صفر) را باز می گرداند اگر تمام نمونه های این کتاب در دست خوانندگان باشند. این روش ارزش N را به دست می آورد، برابر با تعداد نسخه های کتاب، که در حال حاضر در دست خوانندگان هستند.

اگر کتاب هایی با ISBN پیش تعیین شده در کتابخانه نیستند، این روش -100 باز می شود (منهای یکصد).

روش 3. بررسی وجود خواننده با نام خانوادگی مشخص شده و تاریخ تولد

این روش خواننده خواننده را باز می کند اگر خواننده با چنین اطلاعاتی وجود داشته باشد، 0 (صفر) در غیر این صورت.

هنگام مقایسه تاریخ تولد، شما باید از تابع تبدیل تبدیل () تبدیل برای تبدیل تاریخ تولد - متغیر شخصیت نوع varchar (8) استفاده شده به عنوان پارامتر ورودی روش به داده های داده، که در جدول خوانندگان استفاده می شود استفاده می شود. در غیر این صورت، عملیات مقایسه هنگام جستجو برای این خواننده کار نخواهد کرد.

روش 4. وارد کردن یک خواننده جدید

این روش دارای پنج پارامتر ورودی و سه خروجی است.

پارامترهای ورودی:

  • نام کامل با حروف اول؛
  • نشانی؛
  • تاریخ تولد؛
  • تلفن منزل؛
  • کارگر تلفن

پارامترهای خروجی:

  • شماره خواننده؛
  • نشانه ای از اینکه آیا خواننده قبلا در کتابخانه ثبت شده بود (0 - نبود، 1 بود)؛
  • تعداد کتابهایی که برای خواننده فهرست شده است.
روش 5. شمارش خوب در شرایط پولی برای خوانندگان بدهکار

این روش با مکان نما، که حاوی لیستی از شماره بلیط های خواننده همه بدهکاران است، کار می کند. در طول کار، یک جدول موقت جهانی ## DOLG باید ایجاد شود، که در آن کل بدهی آن برای هر بدهکار برای همه کتابهایی که او بیشتر باز می گردد، ذکر شده است. جبران خسارت پولی در 0.5٪ از قیمت کتاب برای روز تاخیر محاسبه می شود.

روش انجام کار

  • کپی های صفحه نمایش (تصاویر) تایید تغییرات به پایگاه داده؛
  • محتویات جداول پایگاه داده که مورد نیاز برای تأیید صحت کار هستند؛
  • متن ذخیره شده متن با نظرات؛
  • فرآیند شروع روش ذخیره شده با خروجی نتایج عملکرد.

وظایف اضافی

دستورالعمل های زیر ذخیره شده زیر برای وظایف فردی مورد نظر قرار می گیرند.

روش 6. شمارش تعداد کتاب ها در یک موضوع موضوع داده شده که در حال حاضر در کتابخانه حداقل در یک نمونه وجود دارد. منطقه موضوع به عنوان پارامتر ورودی منتقل می شود.

روش 7. یک کتاب جدید را با نشانه ای از موارد آن وارد کنید. هنگام وارد کردن موارد کتاب جدید، فراموش نکنید که شماره های موجود در موجودی خود را وارد کنید. فکر می کنم چگونه می توان آن را انجام داد. من به شما یادآوری می کنم که توابع Max و Min را دارید که به شما امکان می دهد حداکثر یا حداقل مقدار هر ویژگی عددی را به ابزارهای انتخابی انتخاب کنید.

روش 8. تشکیل یک جدول با لیستی از خوانندگان بدهکار، یعنی کسانی که قرار بود کتاب ها را به کتابخانه بازگردانند، اما هنوز به آن بازگشته اند. در جدول نتیجه، هر خواننده بدهکار باید تنها یک بار ظاهر شود، صرف نظر از چند کتاب که او بدهکار است. علاوه بر شماره نام و شماره خواننده در جدول حاصل، شما باید آدرس و آدرس تلفن را مشخص کنید.

روش 9. جستجو برای یک نسخه رایگان از نام مشخص شده کتاب. اگر یک نسخه رایگان وجود داشته باشد، این روش تعداد موجودی نمونه را باز می کند؛ اگر نه، این روش یک لیست از خوانندگان را که این کتاب را دارند، نشان می دهد، نشان دهنده تاریخ بازگشت کتاب و تلفن خواننده است.

روش 10. خروجی فهرست خوانندگان که در حال حاضر یک کتاب واحد را در دست ندارند. در لیست، نام و تلفن را مشخص کنید.

روش 11. خروجی فهرست کتابها نشان دهنده تعداد نسخه های این کتاب در کتابخانه و تعداد نمونه های آزاد در حال حاضر است.

نسخه چاپی

در این آموزش شما یاد خواهید گرفت ایجاد و حذف روش ها در SQL Server (Transact-SQL) با نحو و نمونه ها.

شرح

در SQL Server، این روش یک برنامه ذخیره شده است که در آن شما می توانید پارامترها را انتقال دهید. این یک مقدار را به عنوان یک تابع بازگشت نمی کند. با این حال، می تواند وضعیت موفقیت / امتناع به روش را که باعث آن شد، بازگرداند.

ایجاد روش

شما می توانید روش های ذخیره شده خود را در SQL Server ایجاد کنید (Transact-SQL). بیایید نزدیک تر نگاه کنیم

نحو

نحو روش در SQL Server (Transact-SQL):

ایجاد (Procedure | proc) procienture_name
[parmeter datatype.
[متفاوت] [\u003d پیش فرض] [خارج | خروجی | فقط خواندنی]
، parameter datatype.
[متفاوت] [\u003d پیش فرض] [خارج | خروجی | فقط خواندنی]]
[با (رمزگذاری | recompile | به عنوان بند) اجرا شود)]
[برای تکرار]
مانند
شروع.
Exective_Section
پایان؛

پارامترها یا استدلال

schema_Name نام طرح است که دارای روش ذخیره شده است.
procedure_name یک نام برای اختصاص این روش در SQL Server است.
parmeter - یک یا چند پارامتر به روش منتقل می شود.
type_schema_name یک نمودار است که دارای یک نوع داده در صورت لزوم است.
DataType - نوع داده برای parameter.
متفاوت است - تنظیم برای پارامترهای مکان نما زمانی که مجموعه نتیجه پارامتر خروجی است.
به طور پیش فرض - مقدار پیش فرض برای اختصاص پارامتر parameter.
Out - این به این معنی است که parameter یک پارامتر خروجی است.
خروجی - این به این معنی است که parameter یک پارامتر خروجی است.
Readonly - این به این معنی است که parameter را نمی توان با روش ذخیره شده رونویسی کرد.
رمزگذاری - این به این معنی است که منبع روش ذخیره شده به عنوان متن معمولی در SQL Server Service Service ذخیره نخواهد شد.
recompile - این به این معنی است که طرح پرس و جو برای این روش ذخیره شده ذخیره نخواهد شد.
اجرای AS - زمینه امنیتی را برای انجام روش ذخیره شده تنظیم می کند.
برای تکرار - این به این معنی است که روش ذخیره شده تنها در طول تکرار انجام می شود.

مثال

یک نمونه از ایجاد یک روش ذخیره شده در SQL Server (Transact-SQL) را در نظر بگیرید.
در زیر یک مثال ساده از روش است:

Transact-SQL

ایجاد روش FindSiteSiteSiteSite_Name varchar (50) از آنجا که شروع به @ site_id int؛ set@site_id \u003d 8؛ اگر site_id.< 10 SET @site_name = "yandex.com"; ELSE SET @site_name = "google.com"; END;

ایجاد روش FindSite.

@ site_name varchar (50) خارج

شروع.

اعلام @ site_id int؛

set @ site_id \u003d 8؛

اگر @ site_id< 10

set @ site_name \u003d "yandex.com"؛

دیگر

set @ site_name \u003d "google.com"؛

پایان؛

این روش FindSite نامیده می شود. این یک پارامتر به نام site_name است، که پارامتر خروجی است که بر اساس متغیر site_id به روز می شود.

سپس شما می توانید به یک روش ذخیره شده جدید به نام FindSite به صورت زیر مراجعه کنید.

زنگ.

کسانی هستند که این خبر را قبل از شما خوانده اند.
مشترک شدن برای دریافت مقالات تازه.
پست الکترونیک
نام
نام خانوادگی
چگونه می خواهید زنگ را بخوانید
بدون هرزنامه