PDA

View Full Version : استفاده از if در UDF که یک Table بر میگردونه



nazaninam
چهارشنبه 18 مرداد 1385, 08:05 صبح
سلام من یک تابع نوشتم که 1 پارامتر ورودی داره و بسته به مقدار این پارامتر باید جدول های متفاوتی رو بر گردونه
تابع زیر به خوبی کار میکنه


CREATE FUNCTION [dbo].[mygroup] (@group int)
RETURNS TABLE AS
RETURN
select * from mytbl





و لی وقتی از دستور if استفاده می کنم خطا های مختلف و بی مورد میگیره:پ



CREATE FUNCTION [dbo].[mygroup] (@group int)
RETURNS TABLE AS
if @group=1 begin
RETURN
select * from mytbl
end
else
RETURN
select * from mytbl2







اگه میشه راهنماییم کنید که چطور میتونم توی این حالت از شرط استفاده کنم خیلی فوریه ممنون میشم.

nazaninam
چهارشنبه 18 مرداد 1385, 10:30 صبح
یکی راهنمایی کنه خیلی فوریه ):

majid_afra222
پنج شنبه 19 مرداد 1385, 07:10 صبح
سلام
اینکار نشدنیه چون syntax برای این نوع تعریف تابع این امکان رو نداره :


CREATE FUNCTION [ owner_name. ] function_name
( [ { @parameter_name [AS] scalar_parameter_data_type [ = default ] } [ ,...n ] ] )

RETURNS TABLE

[ WITH < function_option > [ [,] ...n ] ]

[ AS ]

RETURN [ ( ] select-stmt [ ) ]


بدنه برای تابع وجود نداره و فقط یه RETURN وجود داره، فقط همین.


چرا از SP استفاده نمی کنی.

بهتره بگی برای چی میخوای اینکار رو بکنی تا بتونیم یه راه حل دیگه پیدا کنیم.

nazaninam
پنج شنبه 19 مرداد 1385, 12:39 عصر
ببینید کار یکم پیچیدست و شاید توضیح دادنش بی مورد باشه .... ولی با این حال خواهش میکنم کمکم کنید
من یک فرم ساختم که سه تا دراپ دان لیست داره که مقادیر اونا به صورت پارامتری با sp پاس شده و مقادیر متناسب اونا توسط یک udf سلکت خواهد شد .
تا اینجا هیچ مشکلی نیست حالا از من خواستن که گزینه "همه" رو به اون دراپ دان لیست ها اضافه کنم حالا تنها کاری که به نظرم میرسه اینه که توی تابع که در زیر اومده چند تا if بگذارم که شما میگید نمیشه :
ببینید من یک sp دارم که کدش اینه :



CREATE PROCEDURE [dbo].[select_complex_group]
(@shive int,@maghta int,@dore int)
AS

SELECT dbo.Daneshgah.uni_code, dbo.Daneshgah.uni_name, mygroup.group_code AS g_1, ISNULL(mygroup.fsum, 0) AS fs_1, ISNULL(mygroup.sumall, 0)
AS as_1, mygroup_1.group_code AS g_2, ISNULL(mygroup_1.fsum, 0) AS fs_2, ISNULL(mygroup_1.sumall, 0) AS as_2, mygroup_2.group_code AS g_4,
ISNULL(mygroup_2.fsum, 0) AS fs_4, ISNULL(mygroup_2.sumall, 0) AS as_4, mygroup_3.group_code AS g_5, ISNULL(mygroup_3.fsum, 0) AS fs_5,
ISNULL(mygroup_3.sumall, 0) AS as_5, mygroup_4.group_code AS g_6, ISNULL(mygroup_4.fsum, 0) AS fs_6, ISNULL(mygroup_4.sumall, 0) AS as_6,
ISNULL(mygroup.fsum, 0) + ISNULL(mygroup_1.fsum, 0) + ISNULL(mygroup_2.fsum, 0) + ISNULL(mygroup_3.fsum, 0) + ISNULL(mygroup_4.fsum, 0)
AS sum_f, ISNULL(mygroup.sumall, 0) + ISNULL(mygroup_1.sumall, 0) + ISNULL(mygroup_2.sumall, 0) + ISNULL(mygroup_3.sumall, 0)
+ ISNULL(mygroup_4.sumall, 0) AS sum_all

FROM dbo.Daneshgah INNER JOIN
dbo.TBL_Register ON dbo.Daneshgah.uni_code = dbo.TBL_Register.daneshgah FULL OUTER JOIN
dbo.mygroup(6,@shive,@dore, @maghta ) mygroup_4 ON dbo.Daneshgah.uni_code = mygroup_4.daneshgah FULL OUTER JOIN
dbo.mygroup(5,@shive,@dore, @maghta ) mygroup_3 ON dbo.Daneshgah.uni_code = mygroup_3.daneshgah FULL OUTER JOIN
dbo.mygroup(4,@shive, @dore, @maghta ) mygroup_2 ON dbo.Daneshgah.uni_code = mygroup_2.daneshgah FULL OUTER JOIN
dbo.mygroup(1,@shive, @dore, @maghta ) mygroup ON dbo.Daneshgah.uni_code = mygroup.daneshgah FULL OUTER JOIN
dbo.mygroup(2,@shive,@dore, @maghta ) mygroup_1 ON dbo.Daneshgah.uni_code = mygroup_1.daneshgah
GROUP BY dbo.Daneshgah.uni_code, dbo.Daneshgah.uni_name, mygroup.group_code, mygroup_1.group_code, mygroup_2.group_code,
mygroup_3.group_code, mygroup_4.group_code, mygroup.fsum, mygroup.sumall, mygroup_1.fsum, mygroup_1.sumall, mygroup_2.fsum,
mygroup_2.sumall, mygroup_3.fsum, mygroup_3.sumall, mygroup_4.fsum, mygroup_4.sumall, ISNULL(mygroup.fsum, 0) + ISNULL(mygroup_1.fsum,
0) + ISNULL(mygroup_2.fsum, 0) + ISNULL(mygroup_3.fsum, 0) + ISNULL(mygroup_4.fsum, 0), ISNULL(mygroup.sumall, 0)
+ ISNULL(mygroup_1.sumall, 0) + ISNULL(mygroup_2.sumall, 0) + ISNULL(mygroup_3.sumall, 0) + ISNULL(mygroup_4.sumall, 0)

HAVING (mygroup.fsum <> 0) OR
(mygroup.sumall <> 0) OR
(mygroup_1.fsum <> 0) OR
(mygroup_1.sumall <> 0) OR
(mygroup_2.fsum <> 0) OR
(mygroup_2.sumall <> 0) OR
(mygroup_3.fsum <> 0) OR
(mygroup_3.sumall <> 0) OR
(mygroup_4.fsum <> 0) OR
(mygroup_4.sumall <> 0)
GO




و mygroup هایی که میبینید udf زیر رو صدا میکنن:



CREATE FUNCTION [dbo].[mygroup] (@group_code int,@shive int,@dore int,@maghta int)
RETURNS TABLE AS

RETURN

SELECT dbo.Daneshgah.uni_name, dbo.TBL_Register.daneshgah, dbo.RESHTEHA.group_code,
SUM(dbo.TBL_Register.f_nimsal_2 + dbo.TBL_Register.f_accepted_2 + dbo.TBL_Register.f_know_1 + dbo.TBL_Register.f_out_1 + dbo.TBL_Register.f_cancel_1
+ dbo.TBL_Register.f_transfer_f_1) AS fsum,
SUM(dbo.TBL_Register.m_nimsal_2 + dbo.TBL_Register.m_accepted_2 + dbo.TBL_Register.m_know_1 + dbo.TBL_Register.m_out_1 + dbo.TBL_Register.m_cancel_1
+ dbo.TBL_Register.m_transfer_f_1 + dbo.TBL_Register.f_nimsal_2 + dbo.TBL_Register.f_accepted_2 + dbo.TBL_Register.f_know_1 + dbo.TBL_Register.f_out_1
+ dbo.TBL_Register.f_cancel_1 + dbo.TBL_Register.f_transfer_f_1) AS sumall, dbo.TBL_Register.maghta, dbo.TBL_Register.shive,
dbo.TBL_Register.dore
FROM dbo.Daneshgah INNER JOIN
dbo.TBL_Register ON dbo.Daneshgah.uni_code = dbo.TBL_Register.daneshgah INNER JOIN
dbo.RESHTEHA ON dbo.TBL_Register.reshte = dbo.RESHTEHA.field_code
GROUP BY dbo.Daneshgah.uni_name, dbo.TBL_Register.daneshgah, dbo.RESHTEHA.group_code, dbo.TBL_Register.maghta, dbo.TBL_Register.shive,
dbo.TBL_Register.dore

HAVING (dbo.RESHTEHA.group_code = @group_code) AND (dbo.TBL_Register.maghta = @maghta) AND (dbo.TBL_Register.shive = @shive) AND (dbo.TBL_Register.dore = @dore)



ممنون از لطفتون

majid_afra222
پنج شنبه 19 مرداد 1385, 15:54 عصر
سلام
نظری ندرام، جز اینکه 2 تا SP و چند تا FN داشته باشی.
اگه بتونی ساختار رو با کاری که میخوای بکنی بدی شاید بتونم یه راه حل ساده تر پیدا کنم.