PDA

View Full Version : اجرای یک Stored Procedure با پارامترهای اختیاری



raika17metal
شنبه 29 مرداد 1390, 19:32 عصر
با سلام.
من این Stored Procedure رو طراحی کردم. اما به یه مشکل کوچیک برخورد کردم، برای مقادیری مثل : fyear و ... مقدار پیش فرض NULL در نظر گرفته شده اما از اونجایی که از نوع int هستش زمانی که در سی شارپ پارامتر ارسال نشه مقدار ارسال میشه نه NULL !!!!!!! چی کار کنم که در صورتی که مقدار پارامتر ارسالی عدد 0 بود به جاش NULL در نظر گرفته بشه؟؟؟

CREATE PROCEDURE Student_Report_test
@firstname nvarchar(20)=NULL,
@lastname nvarchar(30)=NULL,
@gender bit = NULL,
@fyear int = NULL,
@fmonth int = NULL,
@fday int = NULL,
@tyear int =NULL,
@tmonth int = NULL,
@tday int = NULL,
@nationalcode nvarchar(10) = NULL
AS
BEGIN
SELECT FirstName,LastName,FatherName,StSex,BirthYear,Birt hMonth,BirthDay,NationalCode,PhoneNumber,CellPhone ,Grade,Email,Address
FROM tblstudents
WHERE FirstName=COALESCE(@firstname,FirstName) AND
LastName=COALESCE(@lastname,LastName)AND
StSex=COALESCE(@gender,StSex) AND
BirthYear >= COALESCE(@fyear,BirthYear) AND BirthYear <= COALESCE(@tyear,BirthYear)AND
BirthMonth >= COALESCE(@fmonth,BirthMonth) AND BirthMonth<=COALESCE(@tmonth,BirthMonth)AND
if(NationalCode <> 0)
NationalCode = COALESCE(@nationalcode,NationalCode)
END

Galawij
شنبه 29 مرداد 1390, 20:05 عصر
از تابع NULLIF استفاده کنید. در صورتی که مقادیر دو پارامتر اول و دوم این تابع یکی باشد، مقدار Null را برمی گرداند. با این مثال متوجه می شید:
DECLARE @1 char(1)
SELECT @1 ='D'
SELECT NULLIF(@1,'D')

البته می تونید مقادیر را برای همه پارامترها صفر در نظر بگیرید و با این تابع Null ها را تبدیل به صفر کنید:
ISNULL(YourField,0)

یوسف زالی
شنبه 29 مرداد 1390, 21:40 عصر
علت ارسال صفر هم می تونه این باشه:
اگر فقط یک بار مقداری در پارامتر ست شده باشه، در دور های بعدی اگر مقدارش رو معین نکنیم مقدار قبلی در اون وجود داره.