در قسمت پانزدهم آموزش SQL Server ،توابع (Functions) در SQL Server را به شما آموزش دادیم و همچنین تابعی ساختیم که خروجی آن از نوع جدول بود. دراین قسمت میخواهیم جدول ساخته شده را مشاهده و بررسی کنیم با ما همراه باشید…
در آموزش قبل ما تابعی ساختیم که خروجی آن از نوع جدول بود .رفتار جدول را داشت ،حال میخواهیم جدول ساخته شده را مشاهده و بررسی کنیم پس به مثال زیر دقت کنید
Create Function NewTable(@code int) Returns @Result Table ( Code int Identity , Name Nvarchar(50) ) AS Begin Insert @Result Select Name_Ketab From Tbl_Ketab Where Code_Ketab=@code Return End
در مثال فوق ما یک تابع با نام NewTable ساخته ایم که یک پارامتر ورودی دریافت میکند به نام @code که ار نوع Integer نیز میباشد و خروجی ان نیز از نوع جدول و با نام @Result میباشد سپس برای جدول موقت فیلد های Code و Name را تعریف کرده ایم که فیلد کد از نوع Integer و شناسه جدول تعیین شده و فیلد Name که از نوع Nvarchar(50) میباشد سپس کلمات کلیدی As و Begin که دستورات را در بدنه Begin و End مینویسیم که دستورات نوشته شده میگوید مقدار فیلد Name_Ketab از جدول Tbl_Ketab انتخاب کن و در جدول موقت @Result که ساخته ایم درج کن البته به شرط انکه مقدار فیلد Code_Ketab برابر با پارامتر ورودی @code که از کاربر میگیرد برابر باشد.
حال میخواهیم مقداری به تابع داده و نتیجه را مشاهد کنیم پس دستورات زیر را در ادامه ذکر میکنیم
همانند تصویر فوق دو خط کدی که هایلایت شده را اضافه میکنیم که یک کوری ساده Select میباشد که تمام مقادیر از تابعی که ساختیم را انتخاب میکند و چون خروجی تابع NewTable از نوع Table تعیین شده میتوان Select را روی ان انجام داد چون خروجی این تابع دیگر رفتاری مثل جداول دارد همچنین یک مقدار به عنوان ورودی نیز به تابع داده ایم که پس از اجرا نتیجه مطلوبی خواهیم داشت.
حال میخواهیم از تمامیه ویژگی هایی که تا به حال اموزش داده ایم مثل پروسیجرها و توابع و .. در این مثال استفاده کنیم.برای این مثال ما دوتابع مجزا میسازیم سپس از ان دوتابع در پروسیجر استفاده میکنیم
Create Function TotalRentPerMonth(@code int,@month int) Returns int As Begin Return ( Select Isnull(Sum (Tbl_Amanat.tedad*Qeymat),0) From Tbl_Ketab,Tbl_Amanat Where Tbl_Ketab.Code_Ketab=Tbl_Amanat.Code_Ketab And Month(Tbl_Amanat.Zaman_Daryaft)=@month ( End
تابع فوق دو مقدار کد و شماره ماه را از ورودی میگیرد و حاصل ضرب مقدار فیلد قیمت و تعداد کتاب را در ماهی که به امانت رفته شده را بر میگرداند و اگر هم در ان ماه کتابی به امات نگرفته شده باشد مقدار صفر را نمایش میدهد همچنین از Aggrigate Function هم برای بدست اوردن شماره ماه از تازیخ دریافت کتاب استفاده شده.حتی میتوان همین تابع را اجرا کرده و نتیجه را گرفت با استفاده از دستورات زیر
Go Select dbo.TotalRentPerMonth(7,8)
حال تابع دیگری نوشته و از این تابع درون ان استفاده میکنیم
Go Create Function YearMonthCompare(@code int) Returns @Result1 Table ( MonthNum int , FirstMonth int , SecondMonth int ) AS Begin Declare @count int=1 While(@count<13) Begin Insert @Result1 Select @count,dbo.TotalRentPerMonth(@code,@count- 1) ,dbo.TotalRentPerMonth(@code,@count) Set @count+=1 End Return End
در تابع فوق میزان قیمت کتاب هایی که در ماه وارد شده و یک ماه قبل تر را نمایش میدهد در این تابع که خروجی ان به شکل جدول است و سه فیلد برای ان تعیین شده و در بدنه این تابع یک حلقه While ذکر شده که در ان از ۱ تا ۱۲ را میشمارد به عنوان ۱۲ ماه و هر ماه را توسط شمارنده @counter چک میکند و در دوماه نتیجه را نشان میدهد و همانگونه که مشاهده میکنید در حلقه While از تابعی که در بالا گفته شد استفاده شده و در اخر نیز بدنه حلقه و تابع را میبندیم.
این تابع هم مانند تابع اول میتوان اجرا کرد و نتیجه را مشاهده کرد
Go Select * From dbo.YearMonthCompare(8)
توسط دستورات فوق نتیجه این تابع را هم میتوان مشاهده کرد
نتیجه تابع به صورت تصویر فوق است همانگونه که مشاهده میکنید در ماههایی که کتابی با کد ۸ به امانت رفته مقدار فیلد تعداد و قیمت ان کتاب در هم ضرب و سپس جمع میشوند و نمایش داده میشوند.
حال میخواهیم از پروسیجری استفاده کنیم که سود و زیان امانت هارا به ما نمایش دهد پس به صورت زیر دستورات را مینویسیم
Go Create Procedure FinalYearChart(@code int) AS Begin Select MonthNum,Case When FirstMonth < SecondMonth Then 'sood' When FirstMonth > SecondMonth Then 'Zian' Else 'Sabet' End, Cast(SecondMonth As Float) From YearMonthCompare(@code) End
همانگونه که در پروسیجر تعریف شده فوق مشاهده میکنید ما ابتدا یک پارامتر ورودی با عنوان کد تعیین کرده ایم و در ادامه از Case استفاده شده که اگر ماه اول از ماه دوم کوچکتر باشد به معنی سود و اگر بزرگتر بود به عنوان زیان نمایش داده میشود در غیر این صورت مقدار ثابت است و مقدار رشته ایه Sabet را نمایش میدهد و عبارت Cast که تعریف شده بدین معنی است که فیلد SecondMonth را به نوع Float تبدیل میکند چون ممکن است که در توابع بالا نتیجه حاصل ضرب و جمع ها از نوع Int بیشتر شود به همین دلیل بدین صورت انرا به نوع دیگر تبدیل میکنیم.
به عبارت دیگر این پروسیجر شماره ماهها و سود وزیان را براساس تابع قبل که رفتار جدول داردمشخص کرده و نمایش میدهد. پس از نوشتن این دستورات برای دیدن نتیجه باید به مسیر ذخیره پروسیجر برویم که به شرح زیر میباشد Library/Programmability/Stored Procedure و به روی پروسیجر ساخته شده کلیک راست کرده و Execute Stored Procedure.. را کلیک میکنیم و یک مقدار به عنوان کد کتاب به ورودی میدهیم و انرا اجرا میکنیم
همانگونه که در تصویر فوق مشاهده میکنید ما یک مقدار ورودی در قسمت Value میدهیم که کد کتاب محسوب میشود و ok را کلیک میکنیم و نتیجه را به صورا فوق خواهیم دید.