محتویات سایت
        برچسب های محبوب 








 
   معرفی و بحث درباره توابع تعریف شده توسط کاربر در SQL Server
  در این مقاله به معرفی و شرح توابع تعریف شده توسط کاربر در SQL Server خواهم پرداخت .
   SQL Server
   ۴۲۸۸۸
   این مقاله حاوی فایل ضمیمه نمی باشد
   محمد زنگنه
   ۱۳۸۶/۸/۴
نسخه قابل چاپ نسخه قابل چاپ

مقدمه
توابع تعريف شده توسط کاربر در 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 همراه با مثال خواهم پرداخت.

و من الله التوفيق