مقدمه
توابع تعريف
شده توسط کاربر در SQL Server ابزار قدرتمند و سود مندي است که با استفاده
صحيح
و به جا از آنها مي توانيم سرعت و کارايي برنامه هاي خود را بهبود ببخشيم .
لذا
قصد دارم
در چند مقاله به بحث در مورد توابع تعريف شده توسط کاربر(User
Define Function)
و استفاده ها ي آن در SQL Server
بپردازم .
تعريف : توابع تعريف شده توسط کاربر دستورات
ذخيره شده Transact-SQL يا CLR هستند که يک مقدار را برمي گردانند .
استفاده از توابع به دليل اينکه ذخيره شده اند سرعت برنامه هاي شما را بالا مي برد
.اين يکي از چندين مزيت استفاده از توابع مي باشد .
توابع به 3 دسته تقسيم مي
شوند :
توابع تک مقداري (Scalar Valued Function) :
اين توابع يک مقدار از نوع داده هاي مجاز در SQL Server را برمي
گردانند . از آنها در دستور انتساب (SET) يا انتخاب (SELECT) استفاده مي شود . اين
توابع را با استفاده از EXEC هم مي توان اجرا نمود.
به عنوان مثال تابعي مي نويسيم که ميانگين نمرات دانشجويان يک کلاس را محاسبه
کند .
البته اين کار را مي توان با استفاده از يک دستور SELECT همراه با تابع
AVE انجام داد ولي اين مثال به خاطر اهداف آموزشي انتخاب شده است .
CREATE FUNCTION AVERAGE(@UserID INT ) RETURNS FLOAT AS BEGIN
DECLARE @AVE FLOAT DECLARE CUR CURSOR FOR SELECT Rate FROM tbl_Rate
WHERE UserID = @UserID OPEN CUR DECLARE @Rate INT DECLARE @SUM INT
DECLARE @Counter INT SET @SUM = 0 SET @Counter = 0 FETCH NEXT FROM
CUR INTO @Rate WHILE @@FETCH_STATUS = 0 BEGIN
SET @SUM = @SUM + @Rate SET
@Counter = @Counter + 1 FETCH NEXT FROM CUR INTO @Rate
END CLOSE CUR DEALLOCATE CUR SET @AVE = CONVERT (FLOAT,@SUM) /
@Counter RETURN @AVE END
|
شما مي توانيد بعد از اجراي دستورات بالا و ساخته شدن تابع آنرا به اين شکل
استفاده کنيد .
SELECT
FirstName ,LastName , AVERAGE(UserID) FROM tbl_User |
2- توابعي که جدول برمي گردانند :
اين توابع خود به 2 دسته تقسيم مي شوند :
1 – Inline table-Statement
Multi table - Statement- 2
توابع Inline
نوع خاصي از توابع Multi-table هستند ، يعني در حالت کلي شما بايد از
توابع Multi-Statement استفاده کنيد .
شما از توابعي که جدول برمي
گردانند ، دقيقا مانند يک جدول حقيقي مي توانيد استفاده کنيد .
يعني مي توانيد
يک يا چند ستون پانرا انتخاب کنيد يا آنرا با يک جدول يا چند جدول ديگر join
کنيد و ...
استفاده صحيح از اين گونه توابع مي تواند تاثير بسيار مناسبي در
کارايي و سرعت برنامه هاي شما بگذارد و گاهي مسائل مشکل را با استفاده صحيح از اين
توابع به راحتي مي توانيد حل کنيد .
در مورد اين توابع انشاالله در مقاله ديگري
با تفصيل بحث خواهم کرد .
3 - توابع CLR
در SQL Server 2005 اين قابليت يه SQL Server اضافه شد که توابعي که
توسط يکي از زبانهايي که .NET Framework را پشتيباني مي کنند نوشته شده
اند را بتوان در SQL Server استفاده نمود .
يعني يه اين معني که شما
بوسيله يکي از زبانهاي .NET تابعي يا کدي را مي نويسيد و سپس مي توانيد
از اين کد داخل SQL Server استفاده کنيد .
يکي از
استفاده هاي جالبي که از اين قابليت جديد SQL Server مي توانيد بکنيد براي تبديل
تاريخ ميلادي به شمسي است .
همانطور که مي دانيد در .NET 2 با اضافه شدن
Persiancalender تبديل تاريخ از شمسي به تارخ هاي ديگر و از تاريخ هاي ديگر
به شمسي بسيار ساده شده است .
شما مي توانيد براي برنامه هاي خود کلاس و تايعي
بنويسيد که تاريخ ميلادي را به تاريخ شمسي تيديل مي کند ، سپس به راحتي آنرا در SQL
Server استفاده مي کنيد و چون ابن کار در ديتابيس شما انجام مي شود بسيار
سريعتر خواهد بود و در بازيابي هاي شما از ديتابيس تاثير قابل ملاحظه اي خواهد
گذاشت .
براي اين کار شما پس از نوشتن کد خود در
.NET و کامپايل کردن آن بايد يک اسمبلي از اين کد در SQL Server ايجاد
کنيد .سپس از اين اسمبلي در دستورات خود استفاده کنيد .
دستورات زير يک اسمبلي
جديد را در SQL Server ايجاد مي کند .
CREATE ASSEMBLY Test from 'c:\AssemblyName.dll' WITH
PERMISSION_SET = SAFE
|
شيوه
استفاده از اين اسمبلي به شکل زير است :
EXTERNAL NAME FileName.ClassName.MethodName |
درانتها ذکر اين نکته ضروري به نظر مي رسد که تمام مطالب اين مقاله در
SQL Server 2000 هم قابل استفاده است به جز ، توابع CLR که از امکانات خاص SQL
Server 2005 است .
انشاالله در مقالات ديگر بيشتر و مفصل تر به بحث در رابطه با توابع در SQL Server
همراه با مثال خواهم پرداخت.
و من الله التوفيق