PDA

View Full Version : نحوه تعریف تابع و خروجی Table به صورت شرطی !!!



amin_alexi
یک شنبه 15 دی 1387, 09:37 صبح
سلام
من یک تابع به این صورت دارم


CREATE FUNCTION FN_MFD_SelectedAcc_Code (@UserCode nvarchar(50))
RETURNS TABLE AS
RETURN
(
Select Code
From Tbl1
Where Code=@UserCode
)
حالا می خوام یک متغییر Mod هم بزارم و با توجه به Mod دو خروجی متفاوت بگیرم

CREATE FUNCTION FN_MFD_SelectedAcc_Code (@UserCode nvarchar(50),@Mod tinyint)
RETURNS TABLE AS
RETURN
(
IF (@Mod = 1)
Begin
Select Code
From Tbl1
Where Code=@UserCode
End
IF (@Mod = 2)
Begin
Select Code
From Tbl2
Where Code=@UserCode
End
)

ولی Error میده !؟

Msg 156, Level 15, State 1, Procedure FN_MFD_SelectedAcc_Code, Line 5
Incorrect syntax near the keyword 'IF'.
Msg 102, Level 15, State 1, Procedure FN_MFD_SelectedAcc_Code, Line 17
Incorrect syntax near ')'.

نمی دونم باید به چه صورت تعریف کنم ! من می خوام با توجه به Mod از جداول متفاوتی Query بگیرم !
ممنون از دوستان

amin_alexi
یک شنبه 15 دی 1387, 10:03 صبح
با سلام
و تشکر از خودم
فکر کنم حل شد ولی اگه دوستان راه بهتری هم می دونن بگن
ممنون !

CREATE FUNCTION FN_MFD_SelectedAcc_Code (@UserCode nvarchar(50),@Mod tinyint)
RETURNS @ReutrnTable TABLE
(
Code nvarchar(50)
)
As
Begin
IF (@Mod = 1)
Begin
INSERT INTO @ReutrnTable
Select Code
From tbl1
Where Code=@UserCode
End
IF (@Mod = 2)
Begin
INSERT INTO @ReutrnTable
Select Code
From tbl1
Where Code=@UserCode
End
Return
End

amin_alexi
دوشنبه 16 دی 1387, 14:31 عصر
این تابع بیش از انداره کنده !
من دستورات داخل این تابع رو که جدا اجرا می کنم سرعت خوبه !!

Select Code
From tbl1
Where Code=@UserCode ولی فکر کنم مشکل از اون INSERT INTO @ReutrnTable این تو تعداد بالا سرعت رو کم می کنه !
من راهی به غیر از استفاده از Function دارم !
من واسه یه همچین چیزی
Select Code, Name From Tbl3
Where Code In
(
Select Acc_Code From FN_MFD_SelectedAcc_Code('60',1)
)


من راهی دارم که این Function سریعتر عمل کنه !

AminSobati
دوشنبه 16 دی 1387, 18:49 عصر
سلام امین جان،
ترجیحا از توابع مجزا برای جستجو روی جداول مختلف استفاده کنین (البته حالت Inline نه Multi Statement). این به SQL Server کمک بیشتری میکنه برای پیدا کردن الگوریتم بهینه

amin_alexi
سه شنبه 17 دی 1387, 12:25 عصر
سلام و تشکر فراوان از آقای ثباتی عزیز
ممنون از راهنمای هایی که می کنید ....
من هدفم استفاده از این Function در یک SP است ... این SP هم در یک گزارش استفاده میشه می خوام باتوجه به Mod برای هر دو گروه مختلف گزارش بگیرم .... تعداد این مدل SP ها هم که در جاهای مختلف استفاده میشه تقریبا زیاده حالا من اگه از توابع مجزا استفاده کنم باید واسه هر گزارش دو یا بیشتر SP تعریف کنم ...
واسه همین می خواستم کد نویسیم کمتر بشه ولی انگار باید برای سرعت بهتر کد بیشتری بنویسم
باز هم ممنون ... .