PDA

View Full Version : بهترین روش برای جستحوی همه فیلدها



Arash_janusV3
سه شنبه 12 مهر 1390, 17:59 عصر
سلام به دوستان
من می خوام یه جستجو درست کنم برای همه فیلدها یعنی به تعداد فیلدهام من از ------ تا ------- گذاشتم و می خوام یک جستجوی منطقی درست کنم یعنی اینکه کاربر کدام مقدار رو می خواد مهم نباشه من فرض می کنم همشو پر کرده یا بعضی هاشو پر کرده یا پر نکرده
حالتهای زیادی وجود داره و نباید بر اساس حالتها دستور نوشت که اگر این پر شد یک select بنویسیم این روش اصلا منطقی نیست
لطفا یه راه رو نشانم بدید
ممنون

یوسف زالی
سه شنبه 12 مهر 1390, 18:04 عصر
سلام. شرط هاتونو با هم and کنید:

select * from tbl where (@P1 = '' or @P1 = F1) and (@P2 = '' or @P2 = F2) and ...

Arash_janusV3
سه شنبه 12 مهر 1390, 18:14 عصر
سلام. شرط هاتونو با هم and کنید:

select * from tbl where (@P1 = '' or @P1 = F1) and (@P2 = '' or @P2 = F2) and ...

ممنون از پاسختون در این روش برای متغیر هایی که از نوع int هستند کارایی نداره می بایست همه اونها رو به nvarchar تبدیل کرد
آیا این روش منطقیه که ما همه را با cast به nvarchar تبدیل کنیم؟

Galawij
سه شنبه 12 مهر 1390, 18:16 عصر
سلام،
بهتره که به همه پارامترها یک مقدار اولیه صفربدید تا اگر مقداری ارسال نشود آن پارامتر در نظر گرفته نشود. ساختار زیر را بررسی کنید قابلیت انعطاف زیادی دارد:

ALTER PROCEDURE [dbo].[SPR_TenderRequest](@IdTenders BIGINT=0,@IdContractorPersonnelProfile bigint=0,@BeginDate Datetime=NULL,@EndDate Datetime=NULL,@ErrorMessagePersian NVARCHAR(500) OUTPUT,@ErrorNumber INT OUTPUT)
AS
BEGIN
BEGIN TRY
SET @ErrorNumber=0;
Set @BeginDate=ISNULL(@BeginDate,0)
Set @EndDate=ISNULL(@EndDate,0)
SELECT dbo.TbTenderRequest.IdTenderRequest, dbo.TbTenders.IdTenders, dbo.TbTenders.Id_ContractingCompanyProfile,
dbo.TbContractorPersonnelProfile.IdContractorPerso nnelProfile, dbo.TbTenders.TenderSubject,
dbo.TbTenders.TenderNumber, dbo.TbContractorPersonnelProfile.PersonnelName + N' ' + dbo.TbContractorPersonnelProfile.PersonnelFamily AS PersonnelFullName,
dbo.TbTenderRequest.SolarDateRequest, dbo.TbTenderRequest.RequestNumber, dbo.TbTenderRequest.Description
FROM dbo.TbTenderRequest INNER JOIN
dbo.TbTenders ON dbo.TbTenderRequest.Id_Tenders = dbo.TbTenders.IdTenders INNER JOIN
dbo.TbContractorPersonnelProfile ON dbo.TbTenderRequest.Id_ContractorPersonnelProfile = dbo.TbContractorPersonnelProfile.IdContractorPerso nnelProfile
WHERE ((@IdTenders=0)OR(dbo.TbTenders.IdTenders=@IdTende rs))
And
((@IdContractorPersonnelProfile=0)OR(dbo.TbContrac torPersonnelProfile.IdContractorPersonnelProfile=@ IdContractorPersonnelProfile))
And
((@BeginDate=0)OR(dbo.TbTenderRequest.JulianDateRe quest>=DATEADD(DAY,DATEDIFF(DAY,0,@BeginDate),0)))
And
((@EndDate=0)OR(dbo.TbTenderRequest.JulianDateRequ est<=DATEADD(DAY,DATEDIFF(DAY,0,@EndDate),0)))
END TRY

یوسف زالی
سه شنبه 12 مهر 1390, 21:39 عصر
منظور من از '' در حقیقت مقداری هست که با اون تشخیص بدید متغیر نباید لحاظ بشه.
مثلا برای اعداد 1- و برای رشته ها ''