نقل قول: optional parameter
با and or باید در where کنترل کنید
نقل قول: optional parameter
نقل قول:
نوشته شده توسط
hamzehsh
سلام
برای پارامترهای optional که در sp ها تعریف میکنیم مقدار null میگذاریم.
بعضی جاها لازم است که در اجرای sp این شرط ها در نظر گرفته نشود.
نمیخواهم که چند تا پروسیجر تعریف کنم ولی
توی شرط ها چطور میتونیم بگیم که اگر مقدار پارامتر ورودی Null نبود بیاد جستجو انجام بده؟ یا شرایط رو بر اساس وارد کردن پارامتر یا وارد نکردن اون تعریف کنیم؟
آیا استفاده از این روش اصولی هست؟
روش جایگزینی برای این روش وجود داره؟
سلام و روز خوش
شما چند راه دارین که انتخابش بستگی به چیزهایی مثل میزان پیچیده بودن کد پروسیجر اصلی و همینجور پرفورمنس داره.
یک راه ساده (که البته روی پرفورمنس اثر منفی داره) اینه که مستقیما در دستور بیارین:
Procedure ProcName @P1 int=-1 , @P2 nvarchar(100)=''
SELECT * FROM TableName
WHERE (@P1 IS NULL OR Field1=@P1) AND (@P2 IS NULL OR Field2 LIKE @P2)
نقل قول: optional parameter
یک راه دیگه این هست که از بلوک IF استفاده کنین و برای هر حالت یک بلوک بنویسین که البته مشکل پرفورمنس نداره ولی اگر کد پروسیجر پیچیده باشه در تغییرات بعدی باید حواستون به همه بلوک ها باشه:
Procedure ProcName @P1 int=-1 , @P2 nvarchar(100)=''
IF @P1 IS NULL AND @P2 IS NULL
BEGIN
SELECT * FROM TableName
END
IF @P1 IS NULL AND @P2 IS NOT NULL
BEGIN
SELECT * FROM TableName
WHERE Field2 LIKE @P2
END
نقل قول: optional parameter
یک راه دیگه هم این هست که کد sql رو خودتون بسازین که بهش میگن dynamic sql.
البته این هم نیاز به استفاده از بلوک IF داره ولی باز هم کدش خواناتر از روش قبلی هست.
مثال برای این روش زیاد هست ، گوگل کنین.
نقل قول: optional parameter
نقل قول:
نوشته شده توسط
mazoolagh
یک راه دیگه این هست که از بلوک IF استفاده کنین و برای هر حالت یک بلوک بنویسین که البته مشکل پرفورمنس نداره ولی اگر کد پروسیجر پیچیده باشه در تغییرات بعدی باید حواستون به همه بلوک ها باشه:
Procedure ProcName @P1 int=-1 , @P2 nvarchar(100)=''
IF @P1 IS NULL AND @P2 IS NULL
BEGIN
SELECT * FROM TableName
END
IF @P1 IS NULL AND @P2 IS NOT NULL
BEGIN
SELECT * FROM TableName
WHERE Field2 LIKE @P2
END
سلام
بله درسته ممنونم بزرگوار
من از همین روش دارم استفاده میکنم ولی خیلی سخت میشه توسعه داد
نقل قول: optional parameter
نقل قول:
نوشته شده توسط
hamzehsh
من از همین روش دارم استفاده میکنم ولی خیلی سخت میشه توسعه داد
سلام و روز خوش
روش dynamic sql بهتره، البته اونجا هم باید از بلوک if استفاده کنین ولی دیگه تو در تو نیستن و برای هر حالت یک if ساده دارین.
بیرون sql هم میتونین دستور رو بسازین (VB.net یا #C یا ...) که خیلی راحتتر هم هست: یک لیست میسازین و بازای هر پارامتر غیر نول بخش متناظر در where رو به لیست اضافه میکنین و دست آخر همه آیتم های لیست رو با " AND " به هم join میکنین.