PDA

View Full Version : سوالاتی درباره SP و Functionها



In_Chan_Nafar
چهارشنبه 03 مرداد 1386, 19:39 عصر
با عرض سلام خدمت دوستان عزیز. چندتا سوال در مورد SPها داشتم.

1- آیا سرعت Functionهای نوشته شده توسط ما در SQL Server بیشتر می باشد؟
برای مثال ما در برنامه ها مون تاریخ را به صورت DateTime ذخیره می کنیم و به Function در SQL Server نوشتیم که تاریخ میلادی را میگره و اون رو به شمسی تبدیل می کنه آیا این روش بهینه تر هست یا اینکه ما بیایم در خود برنامه این تبدیل رو انجام بدیم؟

2- من تمامی INSERT , UPDATE , SELECT ,... برنامه ها مو به صورت SP نوشتم حالا به یه مشکل خوردم اون هم بحث Tran بین یک Master و چندین Detial هستش من به چه صورت می تونم این کار رو در INsert و UPDATE هام انجام بدم.
برای مثال ذخیره یک فاکتور رو در نظر بگیرید.
جدول سر برگ فاکتور Master می باشد. و کالاهای فاکتور جدول Detail می باشد. پس بنابراین ما یک رکورد در جدول سربرگ (Master) و چندین رکورد در جدول کالاهای فاکتور (Detail) باید Insert کنیم. حالا Insert جدول Master که مشکلی نداره ولی Insert جدول Detail رو در SP چی کار کنم؟ حالا شاید چند تا جدول Detail داشته باشیم؟ آیا بهتر است Tran رو در سطح فرم ایجاد کنم؟ یا از trigger استفاده کنم ؟ لطفا با مثال

AminSobati
چهارشنبه 03 مرداد 1386, 23:01 عصر
دوست عزیزم،
اگر کار تبدیل تاریخ، به صورت موردی رخ میده، از نظر بازده فرقی نداره که شما سمت سرور این کار رو انجام بدین یا کلاینت. اما اگر در یک Select، تعداد زیادی رکورد از این تابع عبور میکنند، پیشنهاد میکنم عمل تاریخ میلادی و هم شمسی رو ذخیره کنید در جدول تا موقع Query نیاز به تبدیل نداشته باشید. البته اینجا موضوع به روز نگه داشتن تاریخ شمسی هم مطرحه. یعنی اگر تاریخ میلادی Update شد، تاریخ شمسی هم (فرضا توسط Trigger) باید به روز بشه. در SQL Server 2005 این نوع فیلدها رو میتونین بعنوان Computed Column تعریف کنین و با عبارت Persisted این فیلد رو بصورت فیزیکی ذخیره کنین. در این حالت دیگه نیازی به Trigger نیست چون خود SQL Server این ستون رو به روز نگه میداره.
در مورد Transactionها، شما میتونین اطلاعات Master و Detail رو در فرم تبدیل به XML کنین و تنها یکبار SP رو صدا بزنین. در SP میتونین XML رو تجزیه کنین (به کمک OpenXML) و در یک Transaction همه اطلاعات رو Insert کنین