PDA

View Full Version : سوال: استفاده از تابع نوشته شده توسط كاربر در دستور where در sql



tara1367
دوشنبه 21 اسفند 1391, 11:48 صبح
سلام دوستان
من ميخوام در دستور sql قسمت where از تابعي كه خودم نوشتم استفاده كنم. تاريخ رو با slash در ديتابيس ذخيره كردم ولي براي انجام عمليات و مقايسه مبخوام حين خواندن داده ها از ديتابيس با استفاده از تابع ClearSlash كه خودم در برنامه نوشتم slash اون رو برداره و عمليات رو انجام بدم. چه طور امكان پذير است؟
با تشكر

veniz2008
دوشنبه 21 اسفند 1391, 11:59 صبح
سلام. نیازی نیست که اینقدر رنج بکشید!. sql یه مجموعه فوق العاده از دستورات هست. کافیه سمت sql اسلش رو بردارید (منظور از MyDate نام فیلد شماست)

select REPLACE(MyDate,'/','') from Table_1
موفق باشید.

tara1367
دوشنبه 21 اسفند 1391, 12:50 عصر
ممنون ولي اول اينكه من از اين فيلد تاريخ كه اسلشش برداشته شده ميخوام در دستور where هم استفاده كنم چه طور امكان پذير هست؟؟؟ و دوم اينكه من در كل ميخواستم كار با توابع User Defined Function در SQL رو ياد بگيرم. اگه كسي ميدونه كمك كنه ممنون ميشم.
با تشكر

veniz2008
دوشنبه 21 اسفند 1391, 13:46 عصر
ممنون ولي اول اينكه من از اين فيلد تاريخ كه اسلشش برداشته شده ميخوام در دستور where هم استفاده كنم چه طور امكان پذير هست؟؟؟
توضیحاتتون نامفهومه. لطفا بیشتر توضیح بدید که دقیقا میخواید چه کاری رو انجام بدید.

و دوم اينكه من در كل ميخواستم كار با توابع User Defined Function در SQL رو ياد بگيرم. اگه كسي ميدونه كمك كنه ممنون ميشم.
با تشكرکار سختی نیست. شما وقتی UDF خودتون رو می سازید یا اون تابع پارامتر ورودی داره یا نداره. بعد از ساخت UDF یک Stored Procedure بسازید و داخلش تابع خودتون رو اجرا کنید. مثلا فرض کنید که UDF شما یک پارامتر ورودی با نام UserID داره و اسم تابع هم CountUserBuy باشه.(میخوایم تعداد خریدهای یک کاربر رو بشماریم). تابع رو اینطور نوشتم :

create Function CountUserBuy(@userid int)
returns int
as
begin
declare @count int
select @count = COUNT(*) from Kharid where UserID = @userid
return @count
end
حالا داخل sp کد زیر رو بنویسید :

create proc MyCountUserBuy
@userid int
as
select dbo.CountUserBuy(@userid)
go
در محیط سی شارپ هم که قطعا خودتون میدونید بصورت زیر خروجی رو چاپ کردم :

SqlConnection con = new SqlConnection("server = .\\md2008;database = DBTest;integrated security = true");
SqlDataAdapter da = new SqlDataAdapter("MyCountUserBuy", con);
da.SelectCommand.CommandType = CommandType.StoredProcedure;
da.SelectCommand.Parameters.AddWithValue("@userid", 5000);
DataTable dt = new DataTable();
da.Fill(dt);
MessageBox.Show(dt.Rows[0][0].ToString());
این فقط یه مثال بود که خواستم نحوه استفاده Function ها رو توضیح بدم.
توجه : حتما قبل از نام function کلمه dbo رو ذکر کنید(مثل همین کدی که واستون گذاشتم).
موفق باشید.

tara1367
سه شنبه 22 اسفند 1391, 09:22 صبح
مرسي خيلي لطف كردين
منظورم اين بود كه همونطور كه گفتم در برنامم تاريخ شمسي با اسلش ذخيره ميشه حالا ميخوام تاريخ رو بخونه و در قسمت where چك كنه كه اين تاريخ بين محدوده تاريخ خاصي (كه در textbox از كاربر ميگيره) هست يا نه بنابراين چون داره در قسمت where چك ميشه در اين قسمت نبايد اسلش داشته باشه تا بتونه چك كنه. با تشكر

veniz2008
سه شنبه 22 اسفند 1391, 12:04 عصر
ببینید یا داخل دیتابیس بصورت بدون اسلش ذخیره شده که موقع خوندن و قرار دادنش جلوی where مشکلی ندارید. ولی احتمالا منظور شما اینه که داخل بانک بصورت
اسلش دار ذخیره شده. خوب قبل از اینکه به دستور select برسید باید تمام اسلش ها رو پاک کنید. میتونید از تابع Replace مربوط به سی شارپ (اون اولی که گفتم مربوط به sql بود ) استفاده کنید و اسلش مربوط به تکست باکس ها رو بردارید.
فقط یه سوال : چرا اسلش ها رو بر میدارید؟. دلیل خاصی واسه این کار دارید؟

tara1367
چهارشنبه 23 اسفند 1391, 08:47 صبح
آره منظورم اينه كه داخل بانك اسلش دار ذخيره شدند اگر بدون اسلش بودن كه مشكلي نداشتم ، اسلش ها رو به اين خاطر برميدارم چون اول اينكه date من از نوع string هست در ثاني مي خوام ببينم تاريخم در محدوده خاصي از تاريخ هست يا نه عمل مقايسه انجام ميدم. با تشكر

veniz2008
چهارشنبه 23 اسفند 1391, 09:20 صبح
آره منظورم اينه كه داخل بانك اسلش دار ذخيره شدند اگر بدون اسلش بودن كه مشكلي نداشتم ، اسلش ها رو به اين خاطر برميدارم چون اول اينكه date من از نوع string هست در ثاني مي خوام ببينم تاريخم در محدوده خاصي از تاريخ هست يا نه عمل مقايسه انجام ميدم. با تشكر
در هر دو مورد اشتباه فکر میکنی دوست من.
یعنی نمیتونیم رشته : "1391/07/27" داشته باشیم؟
یعنی نمیشه سمت sql مثلا رشته "1391/09/06" رو با "1391/08/29" مقایسه کرد و گفت کدومشون بزرگتره؟.
جواب در هر دو مورد مثبت هست. فقط باید تمام تاریخ ها رو 10 کاراکتری ذخیره کنید. مثلا "1391/7/22" اشتباه هست و به مشکل برمیخورید ولی اگر تمام تاریخ ها رو 10 کاراکتری ذخیره کنید هیچ مشکل واستون پیش نمیاد.
دستور select شما اینطوری میشه :

select * from Table_1 where FieldDate between @date1 and @date2
واسه فرمت بندی تاریخ هم (یعنی بصورت yyyy/mm/dd ) از کد زیر استفاده کنید:

DateTime today = DateTime.Today;
PersianCalendar pc = new PersianCalendar();
string date = pc.GetYear(today).ToString("0000") + pc.GetMonth(today).ToString("/00") + pc.GetDayOfMonth(today).ToString("/00");
MessageBox.Show(date);

tara1367
چهارشنبه 23 اسفند 1391, 10:00 صبح
مرسي دوست عزيز مشكلم حل شد نمي دونستم ميتونه بصورت رشته اي هم با هم مقايسه كنه يك دنيا ممنون لطف كردين.