PDA

View Full Version : optional parameter



hamzehsh
یک شنبه 31 مرداد 1400, 12:26 عصر
سلام
برای پارامترهای optional که در sp ها تعریف میکنیم مقدار null میگذاریم.
بعضی جاها لازم است که در اجرای sp این شرط ها در نظر گرفته نشود.
نمیخواهم که چند تا پروسیجر تعریف کنم ولی
توی شرط ها چطور میتونیم بگیم که اگر مقدار پارامتر ورودی Null نبود بیاد جستجو انجام بده؟ یا شرایط رو بر اساس وارد کردن پارامتر یا وارد نکردن اون تعریف کنیم؟
آیا استفاده از این روش اصولی هست؟
روش جایگزینی برای این روش وجود داره؟

fakhravari
یک شنبه 31 مرداد 1400, 20:44 عصر
با and or باید در where کنترل کنید

mazoolagh
دوشنبه 01 شهریور 1400, 09:30 صبح
سلام
برای پارامترهای 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)

mazoolagh
دوشنبه 01 شهریور 1400, 09:38 صبح
یک راه دیگه این هست که از بلوک 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

mazoolagh
دوشنبه 01 شهریور 1400, 09:54 صبح
یک راه دیگه هم این هست که کد sql رو خودتون بسازین که بهش میگن dynamic sql.

البته این هم نیاز به استفاده از بلوک IF داره ولی باز هم کدش خواناتر از روش قبلی هست.
مثال برای این روش زیاد هست ، گوگل کنین.

hamzehsh
سه شنبه 09 شهریور 1400, 11:04 صبح
یک راه دیگه این هست که از بلوک 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


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

mazoolagh
چهارشنبه 10 شهریور 1400, 08:59 صبح
من از همین روش دارم استفاده میکنم ولی خیلی سخت میشه توسعه داد

سلام و روز خوش
روش dynamic sql بهتره، البته اونجا هم باید از بلوک if استفاده کنین ولی دیگه تو در تو نیستن و برای هر حالت یک if ساده دارین.

بیرون sql هم میتونین دستور رو بسازین (VB.net یا #C یا ...) که خیلی راحتتر هم هست: یک لیست میسازین و بازای هر پارامتر غیر نول بخش متناظر در where رو به لیست اضافه میکنین و دست آخر همه آیتم های لیست رو با " AND " به هم join میکنین.