PDA

View Full Version : مشکل در جستجوی پارامتری



javad3151
سه شنبه 18 مرداد 1384, 08:41 صبح
سلام
من در یک جدول چند تا فیلد دارم(نام ، نام خانوادگی ، کد) که می خواهم کاربر بتونه بر اساس هر کدوم از اونها (یا بصورت ترکیبی) جستجو کنه برای اینکار یه stored procedure تعریف کردم:

CREATE PROCEDURE search2
@pnameid nvarchar(10),
@pfid nvarchar (10),
@pcode_f int
AS
select nameid,fid,code_f from sheet1 where nameid like @pnameid and fid like @pfid and code_f=@pcode_f

GO

ولی موقع فراخوانی باید برای همه پارامتر ها مقدار بدم درحالیکه من خی خوام اگر کاربر یه فیلد رو هم وارد کرد جستجو انجام بشه (البته برای فیلدهای متنی می تونستم بجای مقادیر خالی %% بفرستم ولی برای فیلدهای عددی یا تاریخ ؟؟؟؟)

rsl_rostami
سه شنبه 18 مرداد 1384, 14:37 عصر
اگه منظورتون رو درست متوجه شده باشم، شما بهتره بجای and از or استفاده کنید. بعدشم شما تو برنامه تون میتونید بایه کنترل مانع از ایجاد کارکتر خالی تو فیلدهای عددی بشین که دیگه تو دردسر نیفتین.

javad3151
سه شنبه 18 مرداد 1384, 20:42 عصر
فکر کنم نتونستم منظورم رو درست بیان کنم
ببیندمن سه تا فیلد دارم : نام نام خانوادگی کد
حالا اگر کاربر فقط نام رو وارد کنه (مثلا محمد) باید تمام محمد ها رو برگردونه و اگر علاوه بر اون نام خانوادگی رو هم وارد کرد (مثلا باز هم محمد ) باید تمام اونهایی رو که در نام و نام خانوادگی اونها محمد باشه رو برگردونه .
مشکل اینجا است که وقتی یکی از فیلدها خالی فرستاده میشه برنامه خطا میده!
آیا راهی هست که در مثال بالا مثلا اگر پارامتر کد وارد نشد اون رو نادیده بگیره ؟؟؟؟؟؟

javad3151
پنج شنبه 20 مرداد 1384, 07:19 صبح
اساتید محترم جواب!!!!!؟؟؟؟؟؟

majid_afra222
پنج شنبه 20 مرداد 1384, 08:24 صبح
سلام جاوید عزیز
قبلا جواب داده شده، عبارت select اصلی رو داخل یه متغیر قرار بده و بخش where رو با تعیین مقادیر دریافتی از کاربر ایجاد کن و بعد کل رشته کاراکتری ایجاد شده رو با دستور exec اجرا کن.

Happy_davood
پنج شنبه 20 مرداد 1384, 09:22 صبح
خوب بهترین روش هم همینه . به تعداد پارامترهای مورد جستجو می تونی Query درست کنی و بسته به شرایط یکی از اونها رو اجرا کنی .

majid_afra222
پنج شنبه 20 مرداد 1384, 20:50 عصر
سلام
نه داوود جان منظور من این نبود، بخش select رو تو متغیر varchar با طول زیاد درست کن، و با توجه به شرطهای مورد نظرت قسمت where اون رو هم تکمیل کن و آخر کل جمله رو exec کن.

javad3151
جمعه 21 مرداد 1384, 21:45 عصر
سلام
خیلی ممنون که جواب دادید
ولی منظور من این بود که با استفاده از دستورات ذخیره شده این کار رو انجام بدی تا سرعت بالاتری داشته باشی (هر چند که چون به نتیجه نرسیدم آخرش مجبور شدم در زمان اجرای برنامه خودم یه sql طراحی کنم و اجراش کنم)

AminSobati
شنبه 22 مرداد 1384, 11:18 صبح
جواد جان بهترین روش اینه که شما برای پارامترها مقدار پیش فرض Null در نظر بگیرین با استفاده از OR، خالی بودن اونها رو Skip کنین:


CREATE PROCEDURE search2
@pnameid nvarchar(10)=null,
@pfid nvarchar (10)=null,
@pcode_f int=null
AS
select nameid,fid,code_f from sheet1 where
(nameid is null or nameid like @pnameid) and
(fid is null or fid like @pfid) and
(code_f is null or code_f=@pcode_f)

GO

در این حالت اگر پارامتر شما خالی نباشه، مقدار اون توسط Select دقیقا پیدا میشه و اگر خالی یا در حقیقت Null باشه، طبیعتا در Select تاثیر گذار نخواهد بود