ورود

View Full Version : مشکل با Function



حمیدرضاصادقیان
شنبه 01 دی 1386, 16:23 عصر
سلام دوستان.من تابع زیر رو نوشتم ولی هنگام اجراش به مشکل بر میخورم.


CREATE FUNCTION dbo.UdfReturnMaxCode (@Table Nvarchar(10))
RETURNS Int AS
Begin
Declare @Str nVarchar(100),
@result int
set @str='select isnull(max(code),1) As Maxcode from '+@table
exec @result=sp_executesql @str
return @result
End
Go

select dbo.UdfReturnMaxCode('p_oriz1')



ولی هنگام اجراش پیغام خطای زیر رو میده.


Server: Msg 557, Level 16, State 2, Procedure UdfReturnMaxCode, Line 7
Only functions and extended stored procedures can be executed from within a function.

JAFO_IRAN
شنبه 01 دی 1386, 17:15 عصر
سلام

این محدودیت وجود داره (اگه مثل دو تا پست قبلی که براتون فرستاده بودم اشتباه اساسی نکرده باشم). spای که شما استفاده کردید هیچیک از این دو تا نیست...

ارادت

MShirzadi
شنبه 01 دی 1386, 17:58 عصر
در این مورد یه کمی توضیح میدید آیا راه حلی وجود داره یا نه؟؟؟؟

حمیدرضاصادقیان
شنبه 01 دی 1386, 19:42 عصر
آخه یعنی چی؟ الان در ساختار udf من مشکلی ندارم.ولی وقتی Select میزنم بهم خطا میده.آخه برای چی نمیتونم اونو اجرا کنم؟باید چه کرد؟

JAFO_IRAN
شنبه 01 دی 1386, 21:20 عصر
آخه یعنی چی؟ الان در ساختار udf من مشکلی ندارم.ولی وقتی Select میزنم بهم خطا میده.آخه برای چی نمیتونم اونو اجرا کنم؟باید چه کرد؟

سلام

معنی‌اش که معلومه: stored procedure (یا همون sp_executesql) نه function و نه extended stored procedure هست...
اینکه در زمان اجرا خطا میده (نه در زمان تعریف تابع) هم یک داستان متداول در SQL Server هستش - compile که نمیکنه...

اما چون شما فقط میخواهی یک int دریافت کنی، میتونی با یک procedure و استفاده از return value همون نتیجه رو بگیری. اما: حسن این sp که شما استفاده میکنی در اینه که میتونه parametric باشه و شما از این داستان استفاده نکردی. در واقع اگر کدی که شما نوشته بودی کار هم میکرد، نتیجش این میشد که دستور select داخل Str، یک ضرب نتیجه رو به خروجی بفرسته و نه مثلا به Result. ببین این کد به دردت میخوره؟



create proc ReturnMaxCode @Table nvarchar(100)
as
declare @ASQL nvarchar(100), @ARes int
select @ASQL = N'select @ARes=IsNull(Max(Code), 1) from ' + @Table
exec sp_executesql @ASQL, N'@ARes int output', @ARes output
return @ARes
GO
declare @Max int
exec @Max = ReturnMaxCode N'p_oriz1'
select @Max

حمیدرضاصادقیان
یک شنبه 02 دی 1386, 13:23 عصر
ممنون دوست عزیز.من میخواستم از طریق تابع این کار رو انجام بدم از طریق sp انجام داده بودم.