PDA

View Full Version : چرا خروجی stored رو خود sql داره تعیین می کنه؟



marjan_gh
دوشنبه 12 اسفند 1392, 11:00 صبح
من یه تابع نوشتم
ALTER FUNCTION [dbo].[fun_Total_Rate](
@product_id int
-- Add the parameters for the function here


)
RETURNS float
AS


BEGIN
declare @num int ,@number int,@x float,@productId int,@conToFloat1 float,@conToFloat2 float
set @conToFloat1=5
set @conToFloat2=20
set @productId =@product_id
set @num = ( select count(productId)from tblrate where productId=@productId )
set @num=@num/4
select @number = (SELECT sum (rateAmunt ) from tblRate where productId=@productId)
set @x=cast((@number*@conToFloat1)as float)/cast((@num* @conToFloat2) as float)
RETURN @x


END




بعدش اومدم اینجوری صداش کردم
ALTER PROCEDURE [dbo].[sp_rate_speciice_Product]@productid int
AS


BEGIN
declare @x float

SET NOCOUNT ON;


select @x=dbo.fun_Total_Rate(@productid)
-- return @x
END




بعد از اجرا با اینکه همه متغیر هارو اومدم float گرفتم ولی این شده خروجیم

DECLARE @return_value int]

EXEC @return_value = [dbo].[sp_rate_speciice_Product
@productid = 1


SELECT 'Return Value' = @return_value


GO



خوب حالا مشکل اینه که همونطوری که در خروجی می بینین یه متغیر خروجی از نوع int داره که مقدار رو روند می کنه و می ریزه توش

دوستان خیلی گیرم یه کمکی:گریه:

حمیدرضاصادقیان
سه شنبه 13 اسفند 1392, 07:30 صبح
سلام
دوست عزیز شما اینجوری که دارید کار میکنید اشتباهه.
اون یک مقدار دیگه رو داره برمیگردونه وضعیت Execute شدن SP شما رو نشون میده که اگر 0 باشه یعنی درست اجرا شده.
برای کار شما باید یک متغیر از نوع Output تعریف کنید و در خروجی از اون استفاده کنید.
برای اینکار پیشنهاد میکنم اینجا (http://technet.microsoft.com/en-us/library/ms378108.aspx) رو مطالعه کنید.

marjan_gh
سه شنبه 13 اسفند 1392, 09:24 صبح
اینجوری اصلاحش کردم
ALTER PROCEDURE [dbo].[sp_rate_speciice_Product]
@productid int,
@ret float output
AS


BEGIN
declare @x float
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;


select @ret=dbo.fun_Total_Rate(@productid)
return @ret
END




ولی بازم دوتا خروجی داره

یکیش همون اعشاریه هست که می خوام و این یکی گرد شدش

DECLARE @return_value int,
@ret float


EXEC @return_value = [dbo].[sp_rate_speciice_Product]
@productid = 1,
@ret = @ret OUTPUT


SELECT @ret as N'@ret'


SELECT 'Return Value' = @return_value


الان متوجه نمی شم چرا داره دوتا خروجی می ده و علاوه بر اون وقتی دارم sp رو اجرا می کنم با دوتا پارامتر ورودی اجرا می شه یکیش واقعا ور.دی تعریف شده و اون یکی خروجی
می خوام بدونم وقتی داریم تو کد نویسی ازشون استفاده می کنیم error پارامتر نمی گیره؟

حمیدرضاصادقیان
سه شنبه 13 اسفند 1392, 11:43 صبح
دوست عزیز گفتم که شما اصلا نیازی نیست Return Value خود sp رو بگیری.
همون فقط باید از Output استفاده کنی.
یعنی این خط

EXEC @return_value = [dbo].[sp_rate_speciice_Product]

@productid = 1,

@ret = @ret OUTPUT


به این باید تبدیل بشه


EXEC [dbo].[sp_rate_speciice_Product]

@productid = 1,

@ret = @ret OUTPUT

marjan_gh
سه شنبه 13 اسفند 1392, 13:09 عصر
یه توضیح بدم
واقعیتش اینه که من روس استوردم راست کلیک می کنم و گزینه exec رو می زنم تا ببینم چی بهم خروجی می ده
این چیزی که به عنوان خروجی نوشتم همونیه که sql server برام می نویسه!
این قسمت اجراش رو دستی نمی نویسم
اجرا هم می گیریم که بینیم تو لایه های بالایی برنامه چی می ده

حالا اشتباهن؟ دقیقا باید چی کار کنم؟

حمیدرضاصادقیان
سه شنبه 13 اسفند 1392, 20:20 عصر
گفتم دقیقا باید بدون این که مقدار خروجی رو بگیرید و یک متغیر از نوع int تعریف کنید.
همون تعریف متغیر از نوع output کافیه و نیازی به تغییر متغیر دیگه ای نیست.