PDA

View Full Version : چگونه می توان نتیجه اجرای exec را در یک متغیر ذخیره کرد؟



mhd78
شنبه 07 آذر 1383, 09:08 صبح
چگونه می توان نتیجه اجرای exec را در یک متغیر ذخیره کرد؟

vadood
شنبه 07 آذر 1383, 09:45 صبح
فرض کن اسم متغیر @ret_value است. می خواهی یه پروسیجر به نام anyProc را با پارامتر های 'j' و @var1 اجرا کنی:




EXECUTE @ret_value = anyProc 'j', @var1

Mohsen_4194
شنبه 07 آذر 1383, 11:20 صبح
از پارامترهای OUTPUT استفاده کن.

AminSobati
شنبه 07 آذر 1383, 16:09 عصر
دوست عزیزم،
شما هم میتونین از Return Value استفاده کنین و هم از Output Parameter. اما چند نکته:
1) هر SP میتونه فقط یک Return Value اونهم از جنس INT داشته باشه در حالیکه Output Parameter به تعداد زیاد و جنسهای مختلف.
2) به عنوان یک استاندارد، Return Value به عنوان اعلام موفقیت یا عدم موفقیت اجرای SP به کار برده میشه ولی از Output Parameter برای دریافت مقادیر اصلی.
برای مثال از هر دو مورد:

BOL > Creating and maintaining database > Stored Procedures > Creating a stored procedure > Returning data from a ...
موفق باشید

mhd78
دوشنبه 09 آذر 1383, 08:20 صبح
با تشکر از کلیه دوستان که پاسخ داده اند.

از Retuen_Value نمی توان استفاده کرد برای اینکه Return Value وضعیت اجرای پروسیجر یا Query را بر می گرداند نه مقدار واقعی Query را.


از outParameter جهت برگرداندن مقادیر برگشتی استفاده می شود هدف من اجرای یک پروسیجر نیست هدف من اجرای یک Query پارامتریک که با توجه یه پارامترهای ورودی و با توجه به Typeهای مختلف ایجاد می شود که از نوع string است حال برای اجرای این string کافیست از دستو exec استفاده شود.


[quote]declare @vcSql varchar(4000)[/quote]

set @vcSql='select sum(bintProduce) from tblProduction'[quote]

exec(@vcSQL)[/quote]

AminSobati
دوشنبه 09 آذر 1383, 10:19 صبح
از Retuen_Value نمی توان استفاده کرد برای اینکه Return Value وضعیت اجرای پروسیجر یا Query را بر می گرداند نه مقدار واقعی Query را
Return Vaule یک مقدار INT برمیگردونه. حالا مهم نیست این مقدار از Query بدست میاد یا به هر روش دیگه ای. منظور شما از مقدار واقعیه Query چی هست! در اینجا من از Return Vaule استفاده میکنم برای بدست آوردن تعداد سفارشات یک مشتری(در دیتابیس Northwind):

create proc OrderCount
@CustID char(5)
as
declare @OCount int
select @OCount=count(orderid) from orders where customerid=@CustID group by customerid
return @OCount

حالا برای اجرا، یک CustomerID براش میفرستیم، و SP با Return Value مقدار رو برمیگردونه:


declare @RetVal int
exec @RetVal=OrderCount 'alfki'
select @RetVal

mhd78
دوشنبه 09 آذر 1383, 14:40 عصر
جناب آقای ثباتی با تشکر

در مورد مثالی که شما زده اید حرفتان درست است ولی Query شما Static است یعنی نام جدول و فیلدهای آن ثابت است.اگر ممکن است مثال زیر را اجرا کنید



[quote] declare @vcTableName varchar(50)[/quote]
[declare @vcFieldName varchar(50)[/quote
[quote]declare @vcSql varchar(4000)[/quote]
declare @ret_value bigint

'set @vcFieldName='orderid
[quote]set @vcTableName='orders' [/quote]

set @Sql='select @ret_value=count(' + @vcFieldName + ') from '+ @vcTableName

[quote]exec(@Sql)[/quote]

select @ret_value

AminSobati
دوشنبه 09 آذر 1383, 16:23 عصر
دوست عزیزم،
لطفا از [quote] برای نوشتن کد استفاده نکنین.
و این هم جواب سوال شما:

declare @vcTableName nvarchar(50)
declare @vcFieldName nvarchar(50)
declare @Sql nvarchar(4000)
declare @ret_value bigint

set @vcFieldName=N'orderid'
set @vcTableName=N'orders'

set @Sql=N'select @ret_value=count(' + @vcFieldName + N') from '+ @vcTableName

EXECUTE sp_executesql @SQL
, N'@ret_value int output' ,@ret_value output

print @ret_value