PDA

View Full Version : Function



M.kavyani
شنبه 28 آبان 1384, 00:16 صبح
با سلام
میخواستم بدونم که Function چیست و چه موقع هایی باید ازش استفاده کرد؟ من قبلا" تاپیکی رو مطرح کرده بودم با موضوع خروجی SP یکی از دوستان پیشنهاد کرده بودند که از Function هم میتونم استفاده کنم. راستش من تا به حال با function ها کار نکرده بودم و کارایی اونها رو نمیدونم. اگر میشه منبعی در اختیارم قرار بدید یا همینطور مختصر و مفید جواب بدید.
در پناه حق موفق و کامروا باشید

javad3151
شنبه 28 آبان 1384, 07:43 صبح
Function یعنی آبمیوه گیری ، یک چیزی را بهش میدی تا بعد از پردازش های لازم دوباره تحویلت بده (سیب رو می اندازی و آب سیب میگیری) .مثلا برای تبدیل تاریخ، تاریخ میلادی رو بهش میدید و تاریخ شمسی پس می گیرید

سید مسعود موحد
شنبه 28 آبان 1384, 09:48 صبح
دوست عزیز
Function‌ در SQL یعنی همه چی
به این نمونه کدها نگاه کن





ALTER Function [dbo].[Back_MandehRoz]( @Bil_Kol VarChar(3) ,
@Bil_Zir VarChar(6),
@L_Date DateTime)
RETURNS Money AS

Begin
Return (SELECT Mandeh From UnionZirList8 Where Bil_Kol = @Bil_Kol
And Bil_Zir = @Bil_Zir
And ADate = @L_Date)
End





نمونه 2





ALTER Function [dbo].[RealLastMny]( @AccountNo VarChar(20) ,
@DateSelect DateTime ,
@AccountKind Int)
Returns BigInt
Begin
DECLARE @VarReturn BigInt
If @AccountKind = 1
SELECT @VarReturn = LastMny
FROM SStmt
WHERE (AccountNo = @AccountNo) AND
(CAST(CONVERT(varchar,TrDate,111)AS DateTime) = @DateSelect)
ELSE
If @AccountKind = 2
SELECT @VarReturn = LastMny
FROM JStmt
WHERE (AccountNo = @AccountNo) AND
(CAST(CONVERT(varchar,TrDate,111)AS DateTime) = @DateSelect)
ELSE
If @AccountKind = 3
SELECT @VarReturn = LastMny
FROM LStmt
WHERE (AccountNo = @AccountNo) AND
(CAST(CONVERT(varchar,TrDate,111)AS DateTime) = @DateSelect)
ELSE
If @AccountKind = 4
SELECT @VarReturn = LastMny
FROM GStmt
WHERE (AccountNo = @AccountNo) AND
(CAST(CONVERT(varchar,TrDate,111)AS DateTime) = @DateSelect)
Return IsNull(@VarReturn,0)

End







نمونه 3






ALTER Function [dbo].[MinBalance](@Currency1 BigInt ,
@Currency2 BigInt )
RETURNS BigInt

Begin
DECLARE @RturnValue BigInt
SET @RturnValue = @Currency1
If @Currency1 > @Currency2
SET @RturnValue = @Currency2
RETURN @RturnValue
End





نمونه 4






ALTER Function [dbo].[Back_MandehRoz]( @Bil_Kol VarChar(3) ,
@Bil_Zir VarChar(6),
@L_Date DateTime)
RETURNS Money AS

Begin
Return (SELECT Mandeh From UnionZirList8 Where Bil_Kol = @Bil_Kol
And Bil_Zir = @Bil_Zir
And ADate = @L_Date)
End



و نمونه های خیلی باحال تر که میتونی خروجیت یک Table باشه

نمونه 1





ALTER Function [dbo].[GetInterest]( @AccountNo VarChar(20) ,
@StartDate DateTime,
@EndDate DateTime)
RETURNS @RetTable TABLE (AccountNo Varchar(20),
Interest Money,
StartDate DateTime,
EndDate DateTime)
BEGIN

DECLARE @TedadDay Int
SET @TedadDay = DATEDiff(Day,(SELECT StartDate From DateMonth),(SELECT EndDate From DateMonth)+1)

DECLARE @RetResult TABLE (AccountNo Varchar(20),
Interest Money,
StartDate DateTime,
EndDate DateTime)

INSERT @RetResult
SELECT A.AccountNo , Round((Sum(MinBalance) *
IsNull((SELECT Nerkh From vAccInterestInfo
WHERE AccountNo = A.AccountNo) , 1) / 36500) , 0) Interest

, (SELECT Min(DateDay) From MinBalanceAccountEveryDay
WHERE Not(MinBalance IS null) AND AccountNo = A.AccountNo
Group By AccountNo ) StartDate
, (SELECT Max(DateDay) From MinBalanceAccountEveryDay
WHERE Not(MinBalance IS null) AND AccountNo = A.AccountNo
Group By AccountNo ) EndDate

From MinBalanceAccountEveryDay A
WHERE MinBalance >= CAST((SELECT Top 1 ParamValue From AccountParam
WHERE ParamName = 'MinBalance' AND
AccountKind = SubString(A.AccountNo,9,2)
ORDER By ParamDate DESC) AS Money)
GROUP By A.AccountNo

INSERT @RetTable
SELECT AccountNo , Interest , StartDate , EndDate
FROM @RetResult
RETURN
END




نمونه 2





ALTER Function [dbo].[GetAverageAccount]( @AccountNo VarChar(20) ,
@StartDate DateTime,
@EndDate DateTime)
RETURNS @RetTable TABLE (AccountNo Varchar(20),
AverageAccount Money,
StartDate DateTime,
EndDate DateTime)
BEGIN

DECLARE @TedadDay Int
SET @TedadDay = DATEDiff(Day,(SELECT StartDate From DateMonth),(SELECT EndDate From DateMonth)+1)

DECLARE @RetResult TABLE (AccountNo Varchar(20),
AverageAccount Money,
StartDate DateTime,
EndDate DateTime)

INSERT @RetResult
SELECT A.AccountNo , Round((Sum(MinBalance) /
DateDiff(Day,(SELECT Count(*) From MinBalanceAccountEveryDay
WHERE AccountNo = A.AccountNo AND MinBalance Is null),@TedadDay) ) , 0) AverageAccount
, (SELECT Min(DateDay) From MinBalanceAccountEveryDay
WHERE Not(MinBalance IS null) AND AccountNo = A.AccountNo
Group By AccountNo ) StartDate
, (SELECT Max(DateDay) From MinBalanceAccountEveryDay
WHERE Not(MinBalance IS null) AND AccountNo = A.AccountNo
Group By AccountNo ) EndDate

From MinBalanceAccountEveryDay A
GROUP By A.AccountNo

INSERT @RetTable
SELECT AccountNo , AverageAccount , StartDate , EndDate
FROM @RetResult
RETURN
END



دیگه میماند Function های پیشرفته تر که با بقیه اساتید چون من خودم هم کار نکردم

titbasoft
شنبه 28 آبان 1384, 11:59 صبح
در SQL Server سه نوع User Defined Function یا UDF وجود داره.
1) Scalar functions : مقدار بازگشتی یک مقدار اسکالر است
2) Inline table-valued functions : مقدار بازگشتی یک جدول است (ساختار جدول مشخص نیست)
3) Multistatement table-valued functions : مقدار بازگشتی یک جدول است (ساختار جدول مشخص است)
این سه نوع UDF تفاوت های خیلی بیشتری حتی در مقادیر بازگشتی نسبت به هم دارند. برای اطلاعات بیشتر:
BOL > Creating and Maintaining Databases > User-Defined Functions

M.kavyani
شنبه 28 آبان 1384, 17:49 عصر
خیلی خیلی ممنون از راهنمایی های کاملتون
از تک تک دوستان کمال تشکر را دارم
در پناه حق موفق و کامروا باشید.