# پایگاه‌های داده > SQL Server > T-SQL >  تفاوت store procedure با function ها

## mehrdad85

سلام 
دوستان ممنونتون میشم لطف کنید راهنمایی بفرمایید که store procedure ها با function ها چه تفاوت هایی دارند و یا موارد استفاده هر کدوم چیا هستن؟

مرسی

----------


## Touska

In many instances you can accomplish the same task using either a stored procedure or a function. Both functions and stored procedures can be custom defined and part of any application. Functions, on the other hand, are designed to send their output to a query or T-SQL statement. For example, User Defined Functions (UDFs) can run an executable file from SQL SELECT or an action query, while Stored Procedures (SPROC) use EXECUTE or EXEC to run. Both are instantiated using CREATE FUNCTION.

To decide between using one of the two, keep in mind the fundamental difference between them: stored procedures are designed to return its output to the application. A UDF returns table variables, while a SPROC can't return a table variable although it can create a table. Another significant difference between them is that UDFs can't change the server environment or your operating system environment, while a SPROC can. Operationally, when T-SQL encounters an error the function stops, while T-SQL will ignore an error in a SPROC and proceed to the next statement in your code (provided you've included error handling support). You'll


ترجمه آن با GOOgle :

در بسیاری از موارد شما می توانید همان کار را با استفاده از هر دو روش های ذخیره شده و یا یک تابع انجام. هر دو از توابع و رویه ذخیره شده را می توان سفارشی تعریف شده و بخشی از هر برنامه است. توابع ، از سوی دیگر، طراحی شده برای ارسال خروجی خود را به پرس و جو و یا T - SQL بیانیه. به عنوان مثال ، کاربر تعریف توابع (UDFs) می تواند فایل های اجرایی از SQL SELECT یا پرس و جو عمل، اجرا در حالی که استفاده از رویه ذخیره شده (SPROC) EXECUTE یا EXEC برای اجرا. هر دو نمونه هستند با استفاده از تابع CREATE.

برای تصمیم گیری بین با استفاده از یکی از این دو، به خاطر داشته باشید تفاوت اساسی بین آنها : روش های ذخیره شده طراحی شده اند برای بازگشت به خروجی آن به برنامه.UDF را برمی گرداند متغیر جدول، در حالی SPROC می تواند یک متغیر جدول بر نمی گرداند هر چند می تواند یک جدول ایجاد کنید. یکی دیگر از تفاوت قابل توجهی بین آنها این است که UDFs می تواند محیط سرور و یا محیط سیستم عامل خود را تغییر دهید، در حالی که SPROC می تواند. عملکرد، زمانی که T - SQL با یک خطا مواجه تابع متوقف می شود، در حالی که T - SQL خطا در SPROC و چشم پوشی از اقدام به بیانیه بعدی در کد خود را (شما عبارت است از : خطا در پشتیبانی از دست زدن به). شما

----------


## Galawij

توابع با نوع Scalar-Valued Functions همواره یک نوع داده عددی را برمی گرداند.(در واقع توابع همیشه یک مقدار را برمی گردانند).
توابع با نوع Table-Valued Functions می توانند یک جدول را به عنوان خروجی برگردانند.
در داخل SP ها می توان هر چندین بار که لازم باشد توابع را فراخوانی کرد.
از SP ها بیشتر برای عملیات تکراری (حذف، به روز رسانی، اضافه کردن و ...)بانک اطلاعاتی استفاده می شود به طوری که شما یک روال را می نویسید و بارها از طرف برنامه آن را فراخوانی می کنید.

----------


## Kamyar.Kimiyabeigi

یکی از مهمترین تفاوتها این است که شما function را میتونین داخل select استفاده کنین ولی sp را نمیتوانید استفاده کنید

----------


## یوسف زالی

> توابع با نوع Scalar-Valued Functions همواره یک نوع داده عددی را برمی گرداند


می تونن هر نوعی از داده نرده ای رو برگردونن. حتی varchar


در Function:
نمی توان از exec استفاده کرد.
نمی توان روی جداول تاثیر گذاشت.
نمی توان به جداول موقتی دسترسی داشت. اما میشه از نوع داده جدول استفاده کرد.
حتما باید یک return داشته باشیم.
return می تواند از هر نوعی باشد.
نمی توان از داده های output استفاده کرد.
برای فراخوانی function فقط اسمشو می نویسیم.

در SP:
نمی توان return از نوعی که غیر عدد صحیح باشه استفاده کنیم.
می توانیم اصلا return نداشته باشیم.
برای فراخوانی SP از exec استفاده می کنیم.

و احتمالا چند تا چیز دیگه که الان یادم نیست.

----------


## eof_programming

یه چیز مهم که Function ها از SP ها سرعت کمتری دارند چون تفسیری هستند. و اینکه میتونی یه Function رو برابر یه متغیر قرار بدی و ازش خروجی بگیری اما با SP نمیشه.

----------


## mah_dal

با اجازه اساتید.

Functions 
----------
1) can be used with Select statement
2) Not returning output parameter but returns Table variables
3) You can join UDF
4) Cannot be used to change server configuration
5) Cannot be used with XML FOR clause
6) Cannot have transaction within function

Stored Procedure
-----------------
1) have to use EXEC or EXECUTE
2) return output parameter
3) can create table but won’t return Table Variables
4) you can not join SP
5) can be used to change server configuration
6) can be used with XML FOR Clause
7) can have transaction within SP

در واقع :


----------

It's more accurate to say it as: "Functions cannot be used to change ANYTHING". Functions in SQL are not allowed to have any kind of permanent effect, so they can't modify ANYTHING permanent. The only thing they're allowed to change would be a table variable created within the function itself.
و
If you can't modify anything - there's no point in allowing transactions.....

You can't join to 'SP' DIRECTLY. You can use some easy techniques to join to it (OPENQUERY for one thing).

----------

