PDA

View Full Version : مشکل در کار کردن با تابع ISNULL



csharpcollegian
شنبه 22 اسفند 1394, 17:55 عصر
سلام وقت به خیر
دوستان من برای پیاده سازی یک جستجوی ترکیبی روی یکی از جداول دیتابیسم از Stored Procedure زیر استفاده کردم :

CREATE PROCEDURE procPersonnelSearch
@ID int = Null,
@Name nvarchar(50) = Null,
@StartDate datetime = Null,
@EndDate datetime = Null,
AS
BEGIN

Select * From tblPersonnel
Where ID = ISNULL(@ID, ID)
AND Name = ISNULL(@Name, Name)
AND StartDate = ISNULL(@StartDate, StartDate)
And EndDate = ISNULL(@EndDate, EndDate)
END
GO
این Stored Procedure بر اساس متغیرهایی که براش تعریف کردم (مثل نام کارمند، کد پرسنلی کارمند و...) جدولم رو جستجو می کنه و نتیجه مناسب رو برمی گردونه
دلیل اینکه از ISNULL استفاده کردم اینه که بتونم جستجو رو به صورت ترکیبی (چند کلید) هم پیاده سازی کنم
Stored Procedure به خوبی کار می کنه و فقط کافیه متغیر یا متغیرهایی که می خوام بر اساس اونا جستجو انجام بشه رو براش ارسال کنم تا نتیجه رو برگردونه
اما مشکل اینجاست که زمانی که مقدار یکی از پارامتر ها در جدول مربوطش NULL باشه هیچ نتیجه ای رو بر نمیگردونه !
مثلا وقتی مقدار EndDate (تاریخ پایان قرارداد کارمند) در جدول کارمند NULL باشه کد بالا کار نمی کنه !
میخواستم بدونم از چه تکنیک یا تابعی باید استفاده کنم تا در این حالت خاص هم جواب بده ؟
خیلی ممنون

parsdarab
یک شنبه 23 اسفند 1394, 10:56 صبح
سلام
برای این کار من برای هر فیلد دو شرط گذاشتم که با هم or می شوند.

تابع isnull , COALESCE عملکرد یکسانی دارند تقربیا

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

select ISNULL(null, 'a')
select ISNULL('b', 'a')
select ISNULL('', null)
select ISNULL(null, null)


فقط دو فیلد برای کار ن استفاده کردم.

alter PROCEDURE procPersonnelSearch
@ID int = Null,
@Name nvarchar(50) = Null
AS
BEGIN

Select * From test
Where (pid = COALESCE(@ID, pid) or pid is null)
and (name = COALESCE(@Name, name)or name is null)
END

csharpcollegian
یک شنبه 23 اسفند 1394, 11:56 صبح
سلام
برای این کار من برای هر فیلد دو شرط گذاشتم که با هم or می شوند.

تابع isnull , COALESCE عملکرد یکسانی دارند تقربیا

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

select ISNULL(null, 'a')
select ISNULL('b', 'a')
select ISNULL('', null)
select ISNULL(null, null)


فقط دو فیلد برای کار ن استفاده کردم.

alter PROCEDURE procPersonnelSearch
@ID int = Null,
@Name nvarchar(50) = Null
AS
BEGIN

Select * From test
Where (pid = COALESCE(@ID, pid) or pid is null)
and (name = COALESCE(@Name, name)or name is null)
END

ممنون از پاسختون، ولی در SQL Server 2012 همچین تابعی نداریم...

parsdarab
یک شنبه 23 اسفند 1394, 15:00 عصر
سلام خوب از isnull استفده کنید

csharpcollegian
سه شنبه 25 اسفند 1394, 14:19 عصر
سلام خوب از isnull استفده کنید

ممنون با جایگزین کردن تابع ISNULL مشکلم حل شد