ورود

View Full Version : جستجو کردن یک کلمه درون دیتابیس SQL



mojtaba_z
پنج شنبه 25 بهمن 1386, 12:20 عصر
سلام
توی دیتابیس SQL Server 2000 میخوام دنبال یک کلمه خاص بگردم و Table و رکوردی که اون کلمه رو شامل میشه پیدا کنم. آیا راهی وجود داره ؟

rmb_ali
پنج شنبه 25 بهمن 1386, 14:01 عصر
البته که راهی وجود داره و راهش اینه که تعداد فیلدها رو بازیابی کنی و در یک حلق شروع کنی به جستجوی هر فیلد در جدول که البته قبلش باید یه حلقه هم روی جداول داشته باشی

aserfg
پنج شنبه 25 بهمن 1386, 17:15 عصر
دوست گرامی در quary analyzerمی تونی با دستورات sql این کار رو انجام بدی به شرط اینکه حداقل databaseمورد نظر رو بدونی .

User-os
پنج شنبه 25 بهمن 1386, 22:06 عصر
میشه دقیقا بگید چطور این کار رو میشه کرد.من تازه وارد دارم با دلفی اشنا میشم

mojtaba_z
پنج شنبه 25 بهمن 1386, 22:36 عصر
روش استفاده از حلقه که آخرین روش هستش.
برای تعداد Table های زیاد با رکورد های زیاد ، این روش کاربرد نداره.
آیا روش بهتر دیگه ای وجود نداره ؟

SYNDROME
جمعه 26 بهمن 1386, 07:45 صبح
سلام
توی دیتابیس SQL Server 2000 میخوام دنبال یک کلمه خاص بگردم و Table و رکوردی که اون کلمه رو شامل میشه پیدا کنم. آیا راهی وجود داره ؟
می توانید با استفاده از یک مثال توضیح دهید دقیقاً می خواهید چه کار کنید.
اگر می خواهید جستجو کنید می توانید از دستورات Select استفاده کنید و در جدول موقت بریزید و یا با استفاده از Union نتایج را در یک Dataset قرار دهید.
موفق باشید

Amir_Safideh
جمعه 26 بهمن 1386, 10:47 صبح
میشه دقیقا بگید چطور این کار رو میشه کرد.من تازه وارد دارم با دلفی اشنا میشم

خوب برای این کار راههای متفاوتی هست یکی استفاده از دستور Locate در خود دلفی و یکی هم استفاده از دستورات Select و روش دیگه هم روش Filter . خوب برای هر کدوم یه مثال براتون میزارم .
1- Locate :

with Table1 do
begin
if Locate('FieldName',Edit1.Text,[LoCaseInSensitive]) = True then
ShowMessge('Record found')
else
ShowMessage('Record not found');

end;
البته این یه مثال ساده بود که فقط بر روی یک فیلد جستجو میکنه که شما میتونید این دستور رو برای جستجوی بر روی بیش از یک فیلد هم استفاده کنید . البته خاصیت این روش اینه که این دستور اولین رکورد یافته شده رو نمایش میده و اون رکورد رو رکورد جاری قرار میده .
2- Filter :

with Table1 do
begin
Filtered := False;
Filter := 'FieldName = '+Edit1.Text;
Filtered := True;
end;
این هم فیلتر که باز هم قابلیت این رو داره که فیلتر رو بر اساس مقادیر چندین فیلد انجام بدی که بعد از فیلتر فقط رکوردهایی که شامل دستور فیلتر باشند نمایش داده میشن .
3 - Select :
این روش جزء بهترین روشهای جستجوست که قابلیتهای بسیار زیادی داره :

CREATE PROCEDURE SPS_Test
@Param1 nvarchar(30),@Param2 Int As
Select *
From Table1
Where (FieldName1 Like '%'+@Param1+'%') Or (FieldName2 = @Param2)

این یه پروسیجره که توی اس کیو ال سرور ساخته شده و بعد از ساختن اون شما باید اون رو توی برنامه خودتون اجراش کنید که برای اجرای این پروسیجر از این دستور میشه استفاده کرد :

with SPS_Test do
begin
Close;
Parameters.ParamByName('@Param1') := Edit1.Text;
Parameters.ParamByName('@Param2') := StrToInt(Edit2.Text);
ExecProc;
Open;
end;
البته برای استفاده از پروسیجرها لازمه که از یکی از Objectهای سازگار برای ارتباط با دیتابیس و پروسیجر استفاده کنید که احتمالا شما میدونید که چطور باید این پیش نیازها رو اماده کنید هر چند که این مباحث طولانیه و توضیحش مشکله ولی اگر مشکلی بود بفرمائید تا جائیکه از دستمون بر بیاد کمکتون میکنیم .
------------------
موفق باشید.

User-os
جمعه 26 بهمن 1386, 17:59 عصر
یه زحمتی بکشید شما که این قدر خوب توضیح دادید .در مورد object ها و کلا تمام موارد لازم برای اجرای روش جستجوی سوم توضیح بدید.
کمک بسیار خوبی بود.
امیدوارم همواره موفق باشید

mojtaba_z
جمعه 26 بهمن 1386, 22:49 عصر
سلام
برای اینکه منظورم رو بهتر متوجه بشید یه مثال میزنم :
من یک دیتابیس با تعداد 60 تا جدول دارم که هرجدول تقریبا 20 تا فیلد داره. حالا بعد از مدت 2 سال که اطلاعات درون این دیتابیس وارد شده است ، جدولهای اون دارای تعداد زیادی رکورد شده . حالا من میخوام توی این دیتابیس دنبال یک کلمه خاص بگردم و جدول و فیلد و رکوردی که اون کلمه رو شامل میشه پیدا کنم .
اصل موضوع هم اینه که یک دیتابیس سنگین دارم و دنبال یک سری اطلاعات درون اون میگردم و تنها چیزی که دارم یک کلمه هستش و نه میدونم این کلمه توی چه جدول یا فیلدی از دیتابیس هست تا با فیلتر یا Locate یا ... اون رکوردش رو پیدا کنم.!

Vahid_moghaddam
شنبه 27 بهمن 1386, 08:45 صبح
با سلام
Sql اطلاعات مربوط به دیتابیسها، جدولها، spها، trigger ها و ... رو در جدولهای سیستمی قرار می ده. دیتابیس master شامل اطلاعات مربوط به دیتابیسهای مختلفه و جدولهایی که در هر دیتابیس با پیشوند sys شروع می شن، شامل اطلاعات مربوط به اون دیتابیس. به عنوان مثال دستور زیر اسم تمام جدولهایی رو در یک دیتابیس خاص بر می گردونه که کاربر اونها رو ایجاد کرده:







use somedB
select name from sysobjects where type='U'


در این جدول فیلدی به عنوان id وجود داره. هر آبجکت در sql دارای یک id منحصر به فرده. شما با استفاده از این id می تونید مثلا از جدول syscolumns اطلاعات مربوط به فیلدهای یک جدول، یا متن یک sp رو بدست بیارید.
به عنوان پیشنهاد:
از دیتابیس master از جدول sysdatabases دیتابیس ها رو پیدا کنید. با استفاده از دیتابیس پیدا شده، جدولها رو مشخص کنید. با استفاده از جدولها، فیلدها رو و هر طور دلتون می خواد جستجو کنید.
خیلی خیلی خوبه که شما در help در باره جدولهای سیستمی و sp های ایجاد شده پیش فرض sql مطالعه کنید. همه چیز دیتابیسها قابل خوندنه!

mojtaba_z
شنبه 27 بهمن 1386, 09:18 صبح
سلام
جناب آقای Vahid_moghaddam
من یک دیتابیس مشخص دارم که توی پیداکردن نام جداول آن مشکلی ندارم . همچنین برای پیدا کردن نام فیلد های یک جدول هم موردی ندارم .
موردی که شما مطرح کردید یک راه حل برای پیدا کردن لیست نام جداول یک دیتابیس و همچنین پیدا کردن لیست فیلد های یک جدول هستش. که بعد از اون میشه با حلقه های تو در تو کل دیتابیس رو برای پیدا کردن جدول ، فیلد و رکورد شامل کلمه مورد نظر جستجو کرد . و همانطور که قبلا هم گفتم این راه حل را میتونستم بکار ببرم ولی بعلت کثرت و حجم جداول ، فیلد ها و رکورد های دیتابیس هم زمان زیادی میبره و هم استفاده از این روش معقول نیست.

Vahid_moghaddam
شنبه 27 بهمن 1386, 10:09 صبح
دوست عزیز،
من یه روش کلی رو گفتم. مخاطب این سایت فقط شما نیستید و من هم فرض رو بر این نذاشتم که شما اطلاعات کافی ندارید.
با آرزوی موفقیت

mojtaba_z
شنبه 27 بهمن 1386, 10:45 صبح
سلام
آقای Vahid_moghaddam دلیل صحبت من این بود که فکر کردم پست شما جوابی برای سئوال من بوده.
در هر صورت آیا کسی برای سئوال من جوابی به نظرش میرسه ؟

rmb_ali
شنبه 27 بهمن 1386, 10:51 صبح
با این دستور میتونی لیست تمام جداول و فیلدهای اونو از دیتابیس خودت ببینی و میتونی روی این جدول کشخصات رو داشته باشی بعد تو جداول جستجو رو انجام بدی
select a.name,b.name,c.name,b.length from sysobjects a inner join syscolumns b on a.id=b.id inner join systypes c on b.usertype=c.usertype where a.type='U'

User-os
پنج شنبه 09 اسفند 1386, 21:27 عصر
.
3 - Select :
این روش جزء بهترین روشهای جستجوست که قابلیتهای بسیار زیادی داره :

CREATE PROCEDURE SPS_Test
@Param1 nvarchar(30),@Param2 Int As
Select *
From Table1
Where (FieldName1 Like '%'+@Param1+'%') Or (FieldName2 = @Param2)

این یه پروسیجره که توی اس کیو ال سرور ساخته شده و بعد از ساختن اون شما باید اون رو توی برنامه خودتون اجراش کنید که برای اجرای این پروسیجر از این دستور میشه استفاده کرد :

with SPS_Test do
begin
Close;
Parameters.ParamByName('@Param1') := Edit1.Text;
Parameters.ParamByName('@Param2') := StrToInt(Edit2.Text);
ExecProc;
Open;
end;
البته برای استفاده از پروسیجرها لازمه که از یکی از Objectهای سازگار برای ارتباط با دیتابیس و پروسیجر استفاده کنید که احتمالا شما میدونید که چطور باید این پیش نیازها رو اماده کنید هر چند که این مباحث طولانیه و توضیحش مشکله ولی اگر مشکلی بود بفرمائید تا جائیکه از دستمون بر بیاد کمکتون میکنیم .
------------------
موفق باشید.در مورد این روش اگر کامل توضیح بدید ممنون میشم.کامپوننتها آبجکتها و...ممنونم