PDA

View Full Version : مشکل این فانکش چیست



mojahed
سه شنبه 13 مرداد 1388, 11:04 صبح
با سلام دوستان
alter function [dbo].[myfrml](@inp int)
RETURNS int
begin
declare @sql as nvarchar(max)
declare @param int
set @sql= 'SELECT filed1 from table1 where '+ cast(isnull(@inp, 0) as nvarchar(max)) + ' between [start] and [end])'
If Len(@Payable) > 1
begin
set @sql = N'set @param = (' + Replace( @sql , 'x', @Payable) +' ) '
exec sp_executesql @sql, N'@param int output', @param output
end
return @param
end

بهنام بهمنی
سه شنبه 13 مرداد 1388, 13:11 عصر
متغییر (@Payable تعریف نشده است

mojahed
سه شنبه 13 مرداد 1388, 13:31 عصر
آقا جان این فانکشن درستش این هست اونجا اشتباه شده

create function [dbo].[myfrml1](@inp int)
RETURNS int
begin
declare @sql as nvarchar(max)
declare @param int
set @sql= 'SELECT filed1 from table1 where '+ cast(isnull(@inp, 0) as nvarchar(max)) + ' between [start] and [end])'
If Len(@inp) > 1
begin
set @sql = N'set @param = (' + Replace( @sql , 'x', @inp) +' ) '
exec sp_executesql @sql, N'@param int output', @param output
end
return @param
end

Kamyar.Kimiyabeigi
سه شنبه 13 مرداد 1388, 14:53 عصر
create function [dbo].[myfrml1](@inp int)
RETURNS int
begin
declare @sql as nvarchar(4000)
declare @param int
set @sql= 'SELECT filed1 from table1 where '+ cast(isnull(@inp, 0) as nvarchar(4000)) + ' between [start] and [end])'
If Len(@inp) > 1
begin
set @sql = N'set @param = (' + Replace( @sql , 'x', @inp) +' ) '
exec sp_executesql @sql, N'@param int output', @param output
end
return @param
end

mojahed
سه شنبه 13 مرداد 1388, 22:59 عصر
مشکل در تعداد نیست
در هر صورت این پیغام را میدهد
Only functions and extended stored procedures can be executed from within a function.

afrooz_rahmati63@yahoo.com
سه شنبه 13 مرداد 1388, 23:25 عصر
من اين تابع را تست كردم درست است فقط به جای max از یک مقدار ثابت 4000 استفاده کردم. no Errors

mojahed
چهارشنبه 14 مرداد 1388, 06:41 صبح
من sql server express 2005 که تست میکنم این پیغام را میدهد
Only functions and extended stored procedures can be executed from within a function.

ASKaffash
چهارشنبه 14 مرداد 1388, 08:42 صبح
سلام
در help درون SQLServer2008 این متن ارائه شده(استفاده از EXEC محدود است)

mojahed
چهارشنبه 14 مرداد 1388, 08:57 صبح
خوب برای رفع این مشکل چه کنم؟

ASKaffash
چهارشنبه 14 مرداد 1388, 09:21 صبح
سلام
به سمت ایجاد ESP نرو (اگر تجربه آن را نداری) ولی متناسب با نوع مسئله ممکن است بتوان از ترکیب SP و ّFunction این مشکل را حل کرد (البته امیدوارم که از مقدار برگشتی در یک ستون Select نخواهید استفاده کنید) پس مسئله اصلی را بصورت خلاصه مطرح کنید شاید بتوان از راه دیگری اینکار را انجام داد

mojahed
چهارشنبه 14 مرداد 1388, 09:36 صبح
خوب من چطور مشکل خودم را حل کنم.

ASKaffash
چهارشنبه 14 مرداد 1388, 10:09 صبح
سلام
گفتم باید بگوئید هدف تابع چیست ؟ و قرار است چگونه از آن استفاده کنید ؟ تا راه حل ارائه شود

mojahed
چهارشنبه 14 مرداد 1388, 11:18 صبح
هدف تابع این هست که یک فرمول را از جدولی یافته و در آن عدد مورد نظر را قرار میدهد تا مطابق اون مقدار یک نتیجه را برگرداند این نتیجه یک عدد هست به عنوان مثلا

inp=x=1000
فرمول(x+100)/100
نتیجه =؟

ASKaffash
چهارشنبه 14 مرداد 1388, 15:37 عصر
سلام
خوب میتوان از SP استفاده کرد و نتیجه را با Select بازگرداند مثل :


Create Proc Calc
@x Bigint,
@Formula nVarchar(4000)
As
Declare @Cmd nVarchar(4000)
Set @Cmd=Replace(@Formula,'x',@x)
Set @Cmd='Select '+@Cmd
Exec(@Cmd)

روش استفاده :


Calc 1000,'(x+100)/5'

mojahed
چهارشنبه 14 مرداد 1388, 18:43 عصر
خوب اگر یک جدول داشته باشم که ورودی را از آن بگیرم چگونه این کار را بکنم آیا باید با کرسر کار کنم یا طور دیگر
منظورم این هست که در مثال بالا به جای 1000 ورودی یک فیلد باشد.