PDA

View Full Version : سوال: Query های انعطاف پذیر



Shahab_H
یک شنبه 14 شهریور 1389, 18:15 عصر
با سلام

من با C# برنامه نویسی می کنم
به تازگی شروع کردم از SQL Server هم استفاده می کنم اما یه سوال برام پیش اومده
مثلا میخوام یه Query برای سرچ برنامم بنویسم که مثلا کتاب ها رو بر اساس اسم نویسنده سال انتشار اسم و ... سرچ می کنه و برای هر کدوم و ترکیبشون یه SP جدا می نویسم اما تعدادش خیلی زیاد میشه
راهی نیست بشه Query های انعطاف پذیر نوشت که مثلا به جای 10 تا 2 تا نوشت؟

یه سوال دیگه:
برای بعضی فیلدها که Null می تونه باشه وقتی پارامتر ارسال نمی کنم برای متغیر یا Null می فرستم برنامم هنگ می کنه میگه پارامتر ارسال نشده! چرا؟ باید چی کار کنم؟

بهزادصادقی
دوشنبه 15 شهریور 1389, 23:13 عصر
با سلام
مثلا میخوام یه Query برای سرچ برنامم بنویسم که مثلا کتاب ها رو بر اساس اسم نویسنده سال انتشار اسم و ... سرچ می کنه و برای هر کدوم و ترکیبشون یه SP جدا می نویسم اما تعدادش خیلی زیاد میشه
راهی نیست بشه Query های انعطاف پذیر نوشت که مثلا به جای 10 تا 2 تا نوشت؟


می شود یک همچین کاری را کرد. ولی من به هیچ وجه پیشنهاد نمی کنم. عملکرد یک چنین query هایی فوق العاده پائین خواهند بود و سیستم شما بعد از مدتی استفاده غیر فابل استفاده خواهند شد. البته می شود این نوع query ها را طوری نوشت که سرعتشان هم بالا باشد، ولی روش لازم بسیار پیچیده است، و برای درست جا انداختنش، شما احتیاج به تجربه زیادی داری. استفاده از sp های متعدد، با اینکه زمان بر است، بهترین روش در دید من می باشد.



برای بعضی فیلدها که Null می تونه باشه وقتی پارامتر ارسال نمی کنم برای متغیر یا Null می فرستم برنامم هنگ می کنه میگه پارامتر ارسال نشده! چرا؟ باید چی کار کنم؟

فرق این دو تا تعریف را نگاه کن:



create proc WorksWhenNoParamIsPassed
(
@param1 int = null,
@param2 int = 3
)
as
select @param1, @param2;
go


create proc HangsWhenNoParamIsPassed
(
@param1 int,
@param2 int
)
as
select @param1, @param2;
go

exec WorksWhenNoParamIsPassed;

exec HangsWhenNoParamIsPassed;


این کد را توی محیط SQL Server Management Studio اجرا کن. می بینی که یکی از stored procedure ها هنگ می کنه، ولی دیگری درست اچرا می شه. با اینکه به هیچ کدام هیچ پارامتری پاس نمی کنیم. فرقش این است که stored procedure ای که نامش WorksWhenNoParamIsPassed در زمان تعریف پارامتر های خود، عبارت ذیل را در جلوی آن تعریف اضافه کرده است:



= <default values>


این عبارت به SQL Server می گوید اگر کاربر خودش پارامتری را پاس نکرد، تو بیا و از این مقدار برای ارزش آن پارمتر پاس نشده استفاده کن.

Shahab_H
سه شنبه 16 شهریور 1389, 11:28 صبح
استفاده از SP هم خیلی انعطاف پذیر نیست مثلا اگر یک فیلد حذف شه باید اونو از تک تک SP ها حذف کرد یا یک فیلد اضافه شه ترکیب سرچ این فیلد جدید با فیلد های دیگه ممکنه 1000 تا SP بخواد!