PDA

View Full Version : سوال: خطای استفاده از EXEC در تابع



Arghavan_Reza
چهارشنبه 23 بهمن 1387, 12:27 عصر
اشکال این تابع چگونه حل میشود:


CREATE FUNCTION [dbo].[fTest] (@TableName varchar(50))
RETURNS int AS
BEGIN
DECLARE @ID int

DECLARE @SQLString NVARCHAR(500)
SET @SQLString = N'SELECT ID FROM ' + @TableName
EXEC @ID = sp_executesql @SQLString

RETURN @ID
END


و اما خطا :


Only functions and extended stored procedures can be executed from within a function.

a.maleki
چهارشنبه 23 بهمن 1387, 19:29 عصر
دوست عزیز من قطعه کد شما رو امتحان کردم هیچ ایرادی نگرفت کد شما کاملا درسته !!!

Arghavan_Reza
پنج شنبه 24 بهمن 1387, 09:24 صبح
ممنون، ولی در SQL2000 و هنگام اجرا خطا می دهد. آیا نسخه SQL شما فرق می کند؟

mdrd
جمعه 25 بهمن 1387, 12:19 عصر
sp 4 رو واسه sql نصب کردید؟
اگر نصب کردید و باز error میدهد کاری نمیتونید بکنید باید به جای Function از store Procedure استفاده کنید و ودرون sp از sp استفاده کنید فقط در این صورت باید پارامترهای خروجیتونو به صورت OUTPUT تعریف کنید

Arghavan_Reza
دوشنبه 28 بهمن 1387, 14:02 عصر
sp 4 رو واسه sql نصب کردید؟
اگر نصب کردید و باز error میدهد کاری نمیتونید بکنید باید به جای Function از store Procedure استفاده کنید و ودرون sp از sp استفاده کنید فقط در این صورت باید پارامترهای خروجیتونو به صورت OUTPUT تعریف کنید

با تشکر،
با نصب SP4 هم مشکل حل نشد.
به جای function نمی توانم از sp استفاده کنم. از این تابع در دستورات select استفاده می کنم.


دوست عزیز من قطعه کد شما رو امتحان کردم هیچ ایرادی نگرفت کد شما کاملا درسته !!!

ولی این خطا ناشی از چیست؟


Only functions and extended stored procedures can be executed from within a function.

a.maleki
دوشنبه 28 بهمن 1387, 22:35 عصر
من تو ورژن 2005 انجام دادم که مشکلی نداشت

رضا عربلو
سه شنبه 29 بهمن 1387, 21:21 عصر
در داخل Function استفاده از Dynamic Query مقدور نمی باشد. البته این محدودیت را هنگام Create Function متوجه نمی شوید ولی هنگامی که فانکشن تان را اجرا کنید با خطا مواجه می شوید.

mdrd
چهارشنبه 30 بهمن 1387, 00:43 صبح
فعلا تا sql 2008 تو هیچ ورژنی امکان استفاده dynamic sql تو function وجود نداره! باور کن!
تنها کاری که میتونی برای این مشکلت بکنی اینه که تعداد table ها رو که میخوای به عنوان پارامتر پاس کنی محدود کنی و به صورت زیر عمل کنی


ALTER FUNCTION [dbo].[fTest] (@TableName varchar(50))

RETURNS int
AS
BEGIN
DECLARE @ID int


set @id= select id from

case

when @TableName = 'table1' then table1

when @TableName = 'table2' then table2
.
.
.
when @TableName = 'tablen' then tablen

end
RETURN @ID


END

dzmode
دوشنبه 05 اسفند 1387, 21:12 عصر
exec نمي تواند متغيير داشته باشد، بدين معني كه كد زير اشتبها است؛ چون حوزه exec محلي است و متغيير را نمي شناسر.


(exec (select @n=name from student


راه حل:
استفاده از sp_exectsql است(كه يك store procedure systemi مي باشد)،نحوه استفاده از آن و متغيير هاي مورد نيازش را در books on line جستجو كنيد.
موفق باشيد.