PDA

View Full Version : یافتن وجود یک مقدار با استفاده از تابع یا SP



bpzone
دوشنبه 20 اردیبهشت 1389, 11:08 صبح
با سلام
من قصد دارم که یک تابع بنویسم که یک ورودی داشته باشه ( ID تعریف شده برای یک وسیله )
حالا چجوری می تونم با استفاده از تابع یا SP چک کنم که اگه پارامتر ورودی در بانک وجود داشته باشه مقدار 0 و در غیر این صورت مقدار 1 رو برگردونه ؟!

- قصد دارم از این تابع در برنامه نویسی #C استفاده کنم

spring69
دوشنبه 20 اردیبهشت 1389, 11:15 صبح
سلام.
یه کوئری جدید بساز و کد زیر رو بنویس و اجرا کن.


create FUNCTION f_check
(
@pas nvarchar(50)
)
RETURNS int
AS
BEGIN
DECLARE @c int
if exists (SELECT * from tblsettings where pas=@pas)
set @c=1
else
set @c= 0

return @c
END
بعد توی سی شارپ میتونی اینطوری ازش استفاده کنی:

SqlCommand cmd = new SqlCommand("select dbo.f_check(@pas)", cnn);
cmd.Parameters.AddWithValue("@pas", txtPas.Text);

ASKaffash
دوشنبه 20 اردیبهشت 1389, 11:44 صبح
سلام
اینهم یک راه حل :


Create Function Found(@F Int)
Returns Tinyint
Begin
Return IsNull((Select 1 From T Where F=@F),0)
End

روش استفاده :
با استفاده از یک SQLCommand دستور CommandText شما این باشد :


Select R=dbo.Found(10)

bpzone
دوشنبه 20 اردیبهشت 1389, 12:16 عصر
با تشکر از دوستان

کدوم راه سریعتر هست و زمان کمتری رو میگیره ؟

روش اول


create FUNCTION f_check
(
@pas nvarchar(50)
)
RETURNS int
AS
BEGIN
DECLARE @c int
if exists (SELECT * from tblsettings where pas=@pas)
set @c=1
else
set @c= 0

return @c
END
روش دوم


Create Function Found(@F Int)
Returns Tinyint
Begin
Return IsNull((Select 1 From T Where F=@F),0)
End

spring69
دوشنبه 20 اردیبهشت 1389, 12:42 عصر
زياد تفاوتي ندارن.
ولي كد دوستمون چون بازگشتي TinyInt داره و متغيري براي مقدار بازگشتي هم نداره، سريعتر و بهينه تره.
Good Luck

محمد سلیم آبادی
دوشنبه 20 اردیبهشت 1389, 15:13 عصر
سلام
اینهم یک راه حل :


Create Function Found(@F Int)
Returns Tinyint
Begin
Return IsNull((Select 1 From T Where F=@F),0)
End

روش استفاده :
با استفاده از یک SQLCommand دستور CommandText شما این باشد :


Select R=dbo.Found(10)


سلام،
این روش در یک سناریوی خاصی درست اجرا خواهد شد. اگر subquery که در تابع isnull تعریف کردین بیش از یک سطر (مقدار) بر گرداند مشکل ایجاد خواهد شد.

بهتره دستور را از هر مشکل احتمالی ایزوله کنیم:


Create Function Found(@F Int)
Returns Tinyint
Begin
Return IsNull((Select Top 1 1 From T Where F=@F),0)
End

محمد سلیم آبادی
دوشنبه 20 اردیبهشت 1389, 15:34 عصر
زياد تفاوتي ندارن.
ولي كد دوستمون چون بازگشتي TinyInt داره و متغيري براي مقدار بازگشتي هم نداره، سريعتر و بهينه تره.
Good Luck

در این مورد چون تنها به مقادیر 0 و 1 احتیاج هست می تونید به جای نوع INT یا TinyInt از نوع BIT استفاده کنید.

ASKaffash
سه شنبه 21 اردیبهشت 1389, 10:22 صبح
سلام
موضوع ID وسیله است پس بیش از یک رکورد نداریم (ظاهرا کلید است)

محمد سلیم آبادی
سه شنبه 21 اردیبهشت 1389, 14:00 عصر
اگر بخواهم از روشی استفاده کنم اون این خواهد بود:



CREATE FUNCTION msalim (@id INT) RETURNS BIT AS
BEGIN
RETURN (CASE WHEN NOT EXISTS(SELECT NULL FROM table_name WHERE id=@id) THEN 0 ELSE 1 END)
END