PDA

View Full Version : مشکل در ایجاد تابع



milad.biroonvand
چهارشنبه 26 مرداد 1390, 23:21 عصر
سلام

من می خوام یک تابع بنویسم که این تابع یک پارامتر از ورودی بگیره ، یک مقدار صحیح رو خروجی بده ،



CREATE FUNCTION Addition(@pfname varchar(15) )

RETURNS int

BEGIN

RETURN (SELECT avg FROM dbo.Stock WHERE (fname = (@pfname) )

END





و می خواهم در یک کوری دیگه بصورت زیر عمل کنم .


Select sum(nomre) – Addition("ali") as jam from tblstudent


اینها رو که می نویسم خطا می گیره .



خطاش هم میگه



Invalid column name "ali"



آیا نحوه ی تعریف کردن تابع من اشتباه هست ؟



لطفا نحوه ی این کار رو بگین

با تشکر

یوسف زالی
پنج شنبه 27 مرداد 1390, 11:58 صبح
سلام.
احتمالا باید از ' استفاده کنید تا دیگه ارور نداشته باشید.
" برای نام اشیا کاربرد داره نه رشته.

milad.biroonvand
پنج شنبه 27 مرداد 1390, 13:27 عصر
مر30 ، بابت پاسختون ، شما فرض کن من می خوام بجای ali یه فیلد رو ارسال کنم ، این چجور اتفاق می افته .

Galawij
پنج شنبه 27 مرداد 1390, 16:18 عصر
سلام.
اگر نام جدول و فیلدی را که می خواهید به تابع پاس بدید، ثابت هست. خروجی فیلد مد نظر را از یک Select، داخل متغییر بریزید و بعد مقایسه کنید. اگر نه این لینک (http://barnamenevis.org/showthread.php?298708-نوشتن-یک-تابع-که-ورودی-آن-نام-جدول-و-نام-یه-فیلده) کمک خوبی برای شما خواهد بود.

milad.biroonvand
پنج شنبه 27 مرداد 1390, 23:03 عصر
سلام

با تشکر از پاسختون .
ولی من اینکارو که میکنم خطا میده .

من فقط می خوام یک تابع داشته باشم که یک فیلد بهش پاس بدی ، خروجی یک عدد برگردونه .

یوسف زالی
جمعه 28 مرداد 1390, 06:57 صبح
منظور از فیلد چیه؟
مقدار اون ؟ نام اون؟
آیا اگر نام اون مد نظره نام جدول همیشه ثابته؟

milad.biroonvand
جمعه 28 مرداد 1390, 11:17 صبح
منظورم مقدار فیلده .
ببین ، فرض کن من می خوام یک تابع داشته باشه که مشخصات دانشجویان رو نشون میده . بصورت زیر

کد | نام | نام خانوادگی | نمره نوبت اول | جمع نمره ی نوبت اول و دم
1 علی کریمی 18
2 رضا محمدی 15



حالا فرض کن تو یک جدول دیگه اطلاعاتی بصورت زیر داشته بشم .

کد | نمره ی ثلث دوم
1 15

حالا می خوام که جمه نمره ی نوبت اول رو از همون select جدول اول و نمره ی وبت دوم با استفاده از یک تابع گرفته بشه ، که مقدار فیلد کد رو به اون بفرستم و نمره ی نوبت دوم رو برام برگدونه ، یعنی یک دستوری بصورت زیر


select code,stName,stLname,StScore1,StScore1 + getScore2(scode) from tbl1

و محتوای getscore2 بصورت زیر باشه .

select score2 from tbl2 where code = parametr

پارامتر مقداری هست که از جدول 1 گرفته ایم

Galawij
جمعه 28 مرداد 1390, 22:35 عصر
سلام.
به این صورت درمی یاد، چک کردم جواب می ده:
CREATE FUNCTION ReturnScore(@id bigint)
RETURNS bigint
AS
BEGIN
Return (select Score2 from dbo.Tb2 where Tb2.Id=@id)
END
GO
و Select مورد نظز:
SELECT dbo.Tb1.code,dbo.Tb1.stName,dbo.Tb1.stLname,dbo.Tb 1.StScore1,dbo.Tb1.StScore1+dbo.ReturnScore(dbo.Tb 1.code) AS SumScore
FROM dbo.Tb1
این الان یک مشکلی داره، مشکلشم این هست که اگر شما برای یک نفر دو نمره در جدول دوم ثبت کرده باشید، خطا می دهد چون تابع در هر حالت فقط یک مقدار را برمی گرداند.
خیلی راحت از طریق INNER JOIN قابل حل هست، دیگه تابع هم نمی خواست.

milad.biroonvand
شنبه 29 مرداد 1390, 10:23 صبح
سلام

خیلی متشکرم ، بابت جواتون ، من جواب گرفتم ، خوبه ، مشکلی نداره من برا student نمی خوامش ف برا یه کار دیگه بود که با join حل نمی شد .

مر30 موفق و پیروز باشید .