توابع منفرد یا Scalar functions
در این درس از دوره آموزشی SQL Server، با توابع اسکالر (Scalar Functions) و نحوه ایجاد آنها آشنا میشوید. توابع اسکالر در SQL Server برای انجام پردازشهای سفارشی روی دادهها طراحی شدهاند و یک مقدار منفرد (مانند عدد، متن یا تاریخ) را برمیگردانند. در این آموزش، نحوه تعریف یک تابع اسکالر با استفاده از کلمه کلیدی CREATE FUNCTION و پارامترهای ورودی توضیح داده شده است. به عنوان مثال، تابعی ساخته میشود که با دریافت نام یک فروشگاه، آدرس ایمیل مالک آن فروشگاه را از پایگاه داده AdventureWorks بازیابی میکند. همچنین، نکات مهمی در خصوص طراحی بهینه توابع، استفاده از RETURN برای بازگرداندن مقادیر، و اجرای این توابع با دستورات SELECT ارائه شده است. این درس به شما کمک میکند تا از توابع اسکالر برای ایجاد قابلیتهای پیشرفته در پایگاه دادههای خود بهرهبرداری کنید.
در بخش های قبلی ما برخی از ساختارهای تابعی sql server رو دیدیم. دیدیم که برای پیدا کردن چیزهایی شبیه مقدار ماکزیمم ویا مینیمم، توابع مختص اونها رو، sql server دارد. علاوه بر این توابع، زمانی که توابعی رو نیاز داریم ولی اونها در لیست توابع موجود نیستند، میتوانیم توابع دلخواه خودمان رو ایجاد کنیم. بنابراین در این بخش، من نشان میدهم چطور یک تابعی رو ایجاد کنم تا بتواند یک ورودی بگیرد.
در مثال این ویدئو آموزشی، نرم افزار به عنوان ورودی نام یک فروشگاه را میگیرد و برای خروجی آدرس ایمیل فروشندگان فروشگاهها را برمیگرداند و همه دادههای مورد نیاز اون هم در حال حاضر در پایگاه داده نمونه AdventureWorks ذخیره شدند.
بنابراین من برای شما برای این منظور کد آماده شدهای دارم.
شما میتوانید همه اون کدها رو از فایلهای تمرینی خودتان بگیرید و اونها رو کپی و در یک new query، پاست کنید.
الان اگر اجازه بدهید ما در مورد این کد به صورت مختصر صحبت میکنیم.
در اولین خط، کلمه کلیدی create و کلمه کلیدی function وجود دارد و سپس شما باید به تابع، یک نام بدهید. در این مورد نام getowneremail رو میدهیم و سپس در پرانتز، پارامتری رو که دوست دارید، معرفی میکنید. بنابراین درstored procedure، نباید پارامترها رو در پرانتز قرار بدهیم، بلکه باید با یک تابعی اون رو انجام بدهیم. این تابع یک پارامتر قبول میکند که در اینجا، storename نامگذاری شد و همانطور که میبینیم نوع اون varchar هست.
به عبارت دیگر یک کاراکتر متغیر که به اصطلاح به آن variable character میگویند و به عبارت دیگری هم یک رشته کاراکتر یا به اصطلاح string characters است.
سپس در خط بعد، اون کلمه return رو با یک s آورده، این return که با s هست، نوع داده ماشینی ای است، که میخواهد اون رو برگرداند رو معرفی میکند. دوباره این را به شما بگویم که این تابعی که میخواهیم تعریف کنیم از ساختار یک store procedure کاملاً جدا است و فرق دارد، چونکه با یک store procedure اجازه این رو نداریم که نوع برگشت رو مشخص کنیم، که این عمل رو اینجا، توسط یک تابع انجام میدهیم.
در خط 3، کلمه کلیدی as به کار رفته و در خط 4، ما باید با کلمه کلیدی begin شروع میکنیم.
خط 5، متغیری رو اعلام کرده که میخواهد برای نگهداری email address استفاده بشود که اون احتمالاً همان چیزی است که در پایان برگردانده میشود.
خط 7، 8، 9 و 10 بندهای دستور پایانی هستند که به ترتیب در خط 7 و 8 یک دستور select و یک دستور from رو می بینیم که دارد میگوید از sales.vStoreWithContacts انتخابش رو انجام میدهد و خط 9 یک دستور where هست و اونهایی رو که ContactType شان، روی owner هست رو جدا میکند و 10 نام محلی است که، این تابع برای ذخیره تعریف کرده و در خط آخر، خط، 12 دارد میگوید email address برگردانده میشود. اینبار return بدون s هست و کاربر زمانی که این تابع رو اجرا میکند، این مقدار برای اون برگردانده میشود.
اکنون تابع رو اجرا میکنم و پیام Command(s) completed successfully رو میبینم و این خیلی خوب است. ما برای اینکه تابعی رو که تعریف کردیم بخواهیم پیدا کنیم باید لیست پایین توابع که در دیتابیس AdventureWorks، سابفولدری با نام تعریف شده functions رو باز کنیم و بعد از اون نیاز است که Scalar-valued Functions رو باز کنیم Scalar-valued به این معنی است که اساساً شما یک اسکالر را برگردانید یا یک مقدار تکی رو.
اگر اون رو نبینیم مثل همیشه روی آن کلیک راست میکنم و رفرش را میزنم و getOwnerEmail رو الان میبینم.
برای تست این تابع ساختگی مان، یک query جدید باز میکنم و برای اینکار کافی است روی new query کلیک کنم و برخلاف Stored Procedure ها اون رو اجرا میکنم و حالا میخواهم که یک select رو انجام بدهم.
میخواهم یک مقداری رو از این تابع انتخاب کنم پس تابع جدیدی که تعریف کردیم رو درگ می کنیم اینجا.
این تابع getOwnerEmail هست و بعد از اون یک پرانتز و بعد از اون من باید نام برخی از فروشگاهها رو قرار بدهم.
و من میدانم که در اینجا یکی با نام Riders Company وجود دارد و بنابراین اون رو در پرانتز و تک کوتیشن قرار میدهم و دلیل تک کوتیشن هم این است که اون یک رشته ای است که من معرفی کردم و بعدش هم میتوانم جلو بروم و با زدن دکمه execute اون رو اجرا کنم که برای ما یک تک آدرس ایمیل رو برمیگرداند که همان چیزی است که ما انتظار داشتیم.
این آدرس ایمیل، ایمیل خود فروشگاه Riders Company هست. بنابراین همانطور که میبینیم این تابعی که در این ویدئوی آموزشی تعریف کردم دارای ارزش بسیار خوبی هست. اگر شما فکر میکنید که گزارش ها یا برنامه ریزی زیادی رو خواهید داشت و باید آدرس ایمیل فروشگاه خودتان را پیدا کنید و نیاز به نمایش آن دارید، بجای اینکه شما هر بار در query های اس کیو ال، شروع به کد نویسی کنید، میتوانید یک تابعی رو ایجاد کنید که در هر بار با اون پیش بروید و فقط در صورت لزوم از اون تابع استفاده کنید. توابع میتوانند قسمت بزرگی از دستورات select نرم افزار sql باشند، بنابراین من میخواهم جلو بروم و query جدیدی رو باز کنم.
میخواهم برخی از فیلدها رو ازview ای که قبلاً در مورد اون صحبت کردم، با دستور select از sales.vStoreWithContacts انتخاب کنم.
من میخواهم نام فیلد یعنی Name field و firstname و lastname رو select یا انتخاب کنم.
نام فیلد نام فروشگاه و first name و last name مشخصات افراد هست.
چیزی که من میتوانم الان اینجا انجام بدهم این است که اونها رو در تابعی که ایجاد کردم قرار بدهم. در جایی که من ستونها رو لیست کردم میتوانم توابع اسکالر رو، یا همان توابع موجود در سابفولدر scalar-valued functions رو هم لیست کنم. ساختار توابع ساخته شدهای مانند avg و min و max رو می توانیم استفاده کنیم و همچنین می توانیم تابعی که ما خودمان همین الان اون رو ساختیم، یعنی getOwnerEmail رو مورد استفاده قرار بدهیم. پس اون رو از قسمت توابعِ اسکالر یا درست از اینجا یعنی scalar-valued functions انتخاب میکنم و در پرانتزهای بعد از اون باید یک مقداری رو تعریف کنیم و این مقدار میتواند یک ستون باشد.
به همین منظور از نام ستون استفاده میشود و کلمه name رو داخل پرانتزها می نویسیم.
پیش میرویم و اون رو اجرا میکنیم که مجموعه نتایج خوبی رو به ما میدهد و اون شامل name، firstname و lastname هست.
بنابراین این مقادیر به طور مستقیم از ستون ها بیرون کشیده میشوند و سپس فیلد چهارم رو می بینیم. به نظر میرسد که یک ستون است، ولی در واقع از تابع سفارشی شده چند لحظه پیش ما ایجاد شده و می بینیم که ایمیل owner’s یا فروشندگان فروشگاه ها رو به ما میدهد.
بنابراین اگر شما یک query پیچیده داشته باشید که یک دسته اطلاعات خوب در اون باشد، اما ایمیل تان را نداشته باشد خیلی راحت شما میتوانید همانند این تابع رو که در این ویدئوی آموزشی تابعی برای ایمیلها بود ایجاد کنید و سپس به راحتی اون تابعی رو که ایجاد کردید، به کوئری تعریف شده خودتان در sql server اضافه کنید و حالا شما میتوانید ایمیل فروشندگان خودتان رو به اون query برگردانید. برای همین این توابع میتوانند خیلی مفید باشند.