حتما همه برنامه نویسان با اصطلاح "جستجوی پویا" آشنا هستند. خیلی از نرم افزارها صفحه ای را برای کاربران آماده کرده اند به نام "جستجوی پیشرفته" که می توانیم بر اساس یکسری پارامترها جستجو انجام دهیم. طبیعی است که یک درخواست جستجو می تواند بر اساس یک یا چندین پارامتر باشد (یعنی فاکتور های فیلترینگ متغیر و پویا است). این مشکلی است که برنامه نویسان را به فکر فرو می برد. روش های بسیار متنوع از جمله پویا، ایستا و ترکیبی وجود دارند که به آنها در این مقاله که مرجع اصل برای جستجوی پویا هست اشاره شده است.
بکار گیری روش Dynamic برای تازه کارها (در T-SQL) بسیار دشوار است. چرا که ممکن است در عبارت SELECT حروف فارسی، نقل قول و... وجود داشته باشد که تبدیل آن به یک رشته کار دشواری خواهد بود. البته قبلا برای آشنایی دوستان راجب درک نقل قول در اینجا مطلب نوشته ام.
روشی را که می خواهم معرفی کنم Static بوده و پیاده سازی و استفاده ی آن بسیار ساده و کاربردی است.
فرض کنید جدولی داریم شامل ستونهایی با نام های نام کوچک، نام خانوادگی، سن و جنسیت. می خواهیم به کاربر امکان جستجو بر اساس هر چهار فاکتور را بدهیم. بدیهی است که کاربر اختیار دارد هر چهار پارامتر را مقدار دهی کند و بالعکس.
برای این کار یک Stored Procedure با چهار پارامتر ایجاد کرده و برای هر چهار پارامتر مقدار NULL را به عنوان مقدار پیشفرض در نظر می گیریم. به قسمت WHERE عبارت SELECT دقت کنید.
CREATE PROCEDURE dynamic_search_person
@first_name VARCHAR(50) = NULL,
@last_name VARCHAR(50) = NULL,
@age INTEGER = NULL,
@gender BIT = NULL
AS
SELECT first_name + ' ' + last_name AS [نام کامل],
age AS [سن],
gender AS [جنسیت]
FROM Person
WHERE first_name = COALESCE(@first_name, first_name)
AND last_name = COALESCE(@last_name, last_name)
AND age = COALESCE(@age, age)
AND gender = COALESCE(@gender, gender);
اگر تمایل دارید که SP فوق را امتحان کنید قبل از اجرای آن ابتدا جدول زیر را ایجاد و تعدادی سطر در آن درج کنید:
CREATE TABLE Person
(person_nbr INT NOT NULL PRIMARY KEY,
first_name VARCHAR(50) NOT NULL,
last_name VARCHAR(50) NOT NULL,
age INTEGER NOT NULL
CHECK (age > 0),
gender BIT --1 means Mail
--0 means Femail
);
INSERT INTO Person
VALUES
(1, 'Mohammad', 'Salimabadi', 24, 1),
(2, 'Ali', 'Ahmadi', 24, 1),
(3, 'Maryam', 'Mohseni', 27, 0);
و در نهایت پروسیجر را با پارامتر های مختلف امتحان می کنیم:
EXECUTE dynamic_search_person;
EXECUTE dynamic_search_person @gender = 1;
EXECUTE dynamic_search_person @gender = 1, @age = 24;
EXECUTE dynamic_search_person @gender = 1, @age = 24, @first_name = 'Mohammad', @last_name = 'Salimabadi';