Stored Procedure های اشیایی هستند که در اولین بار کامپایل شده و فرمت آن ذخیره می شود (کد کامپایل شده) و در دفعات بعدی میتوان آن را فراخوانی کرد و این مورد خود باعث افزایش سرعت اجرای آن می شود . اما Function ها در هر بار فراخوانی آنها ، ابتدا می بایست کامپایل شوند و سپس اجرا میشوند .
تفاوت های پایه:
Function ها حتما باید مقداری را به عنوان خروجی برگردانند در صورتی که در Stored Procedure ها اختیاری می باشدProcedure می تواند صفر یا n مقدار برگرداند.
Function های فقط می توانند پارامترهای ورودی داشته باشند در صورتی که Stored Procedure ها می توانند پارامتر های Input و Output داشته باشند .
Function ها میتوانند از داخل یک Stored Procedure فراخوانی شوند در حالی که نمیتوان در داخل یک Function اقدام به فراخوانی یک Procedure کرد .
تفاوت های پیشرفته :
Stored Procedure ها اجازه استفاده از دستور SELECT را به خوبی می دهند و همچنین دستورات (DML) insert,update,delete در حالیکه Function ها فقط اجازه استفاده از دستور SELECT را دارند .
Stored Procedure ها نمی توانند در داخل دستورات SELECT استفاده شوند درحالیکه Function می تواند در داخل دستورات SELECT جاسازی شود .
Stored Procedure ها نمی توانند در هر جای دستورات SQL استفاده شوند ، برای نمونه نمی توانند در قسمت های WHERE/HAVING,SELECT استفاده شوند در حالیکه این محدودیت برای Function وجود ندارد .
می توان در داخل Stored Procedure ها استثنا ها را با استفاده از بلوک های try-catch مدیریت کرد در حالیکه در داخل Function نمی توان بلوک های try-catch را مورد استفاده قرار داد .
Function ها می توانند یک Table را در خروجی برگردانند که این Table میتواند در داخل دستورات Join با جداول دیگر مورد استفاده قرار گیرد .
مهمترین ویژگی Stored Procedure ها نسبت به Function ها نگهداری و قابلیت استفاده مجدد execution plan می باشد درحالیکه برای Function ها هربار کامپایل می شود .
نحوه ساخت Function در Sql Server :
-- ================================================
-- Template generated from Template Explorer using:
-- Create Scalar Function (New Menu).SQL
--
-- Use the Specify Values for Template Parameters
-- command (Ctrl-Shift-M) to fill in the parameter
-- values below.
--
-- This block of comments will not be included in
-- the definition of the function.
-- ================================================
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date, ,>
-- Description: <Description, ,>
-- =============================================
CREATE FUNCTION <Scalar_Function_Name, sysname, FunctionName>
(
-- Add the parameters for the function here
<@Param1, sysname, @p1> <Data_Type_For_Param1, , int>
)
RETURNS <Function_Data_Type, ,int>
AS
BEGIN
-- Declare the return variable here
DECLARE <@ResultVar, sysname, @Result> <Function_Data_Type, ,int>
-- Add the T-SQL statements to compute the return value here
SELECT <@ResultVar, sysname, @Result> = <@Param1, sysname, @p1>
-- Return the result of the function
RETURN <@ResultVar, sysname, @Result>
END
GO
میتوان مطابق با شکل زیر نیز فانکشن را ایجاد نمود
نحوه ساخت Stored Procedure در Sql Server :
-- ================================================
-- Template generated from Template Explorer using:
-- Create Procedure (New Menu).SQL
--
-- Use the Specify Values for Template Parameters
-- command (Ctrl-Shift-M) to fill in the parameter
-- values below.
--
-- This block of comments will not be included in
-- the definition of the procedure.
-- ================================================
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
CREATE PROCEDURE <Procedure_Name, sysname, ProcedureName>
-- Add the parameters for the stored procedure here
<@Param1, sysname, @p1> <Datatype_For_Param1, , int> = <Default_Value_For_Param1, , 0>,
<@Param2, sysname, @p2> <Datatype_For_Param2, , int> = <Default_Value_For_Param2, , 0>
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for procedure here
SELECT <@Param1, sysname, @p1>, <@Param2, sysname, @p2>
END
GO