ورود

View Full Version : اعمال نتیجه یک تابع به کمک T-sql



m_reza
یک شنبه 23 مرداد 1384, 22:49 عصر
سلام<o =""></o>

من یک تابع سنگین با دلفی نوشتم که زمان اجراش هم نسبتا بالاست . حالا نتیجه این تابع را می خواهم در چند Database که هر کدوم از آنها دارای چندین Table و هر table هم دارای چندین هزار رکورد می باشد پیاده کنم. برای انجام این کار از ADO و کد زیر استفاده کردم.<o =""></o>


while not(ADOTable1.Eof) do
begin
<o =""></o>ADOTable1.Edit;
<o =""></o>ADOTable1.FieldByName('aaa').Text:=function_x(ADOT able1.FieldByName('aaa').Text);<o =""></o>
ADOTable1.Next;
end;<o =""></o>

ADOTable1.Post;

همانطور که از کد مشخص است پیمایش تک تک رکورد ها و اعمال نتیجه بروی آنها زیاد روش جالبی نیست و متاسفانه زمان اجرای آن بسیار بالاست به طوریکه گاهی اوقات دستگاه هنگ می کنه، حتی برای رفع این مشکل هم تعدادی رکورد را تعیین کردم که تابع روی آنها عمل کنه و بعد از چند ساعت وقت صرف کردن معلوم شد که روی خیلی از رکوردها نتیجه پیاده نشده . در صورتیکه با استفاده از دستور Update در SQL فکر می کنم که این کار خیلی خیلی سریعتر انجام بشه ،‌ حال به نظر شما بهترین راه برای پیاده سازی نتیجه این تابع بر روی این تعداد رکورد چیست ؟ و یا به عبارت بهتر چگونه می تونم به کمک دستورات SQL این کار را انجام بدم ؟<o =""></o>

<o =""></o>

با تشکر<o =""></o>

AminSobati
دوشنبه 24 مرداد 1384, 01:14 صبح
دوست عزیزم،
بنده از دلفی چیزی نمیدونم ولی اگر بفرمایید که تابع شما دقیقا چه کاری انجام میده شاید بشه راه حلی ارئه کرد. ولی شما خیلی کلی توضیح دادین که فقط قراره یک کاری روی تک تک رکوردها انجام بشه!..

m_reza
دوشنبه 24 مرداد 1384, 19:27 عصر
ضمن تشکر از توجه شما باید بگم که این تابع را حتما میشه با T-sql نوشت ، اما با توجه به عدم تسلط کافی به آن از دلفی استفاده کردم . در حقیقت کار این تابع 8 رقمی کردن تلفن ها هست بدین صورت که مثلا رشته ای به صورت 2123456, 2234567-5, 9712131, (0711)3456789-4, 2250011 داریم و این تابع تغییرات لازم را روی آن انجام میدهد ، و روش کار به این صورت است که ابتدا شماره تلفن ها را تفکیک و در یک آرایه قرار دادم و پس از تشخیص تلفن تهران یا شهرستان و با توجه به شرایط مسئله آنها را تغییر دادم. حالا اگه فکر می کنید که میشه با Sql کاری کرد لطفا راهنماییم کنید چراکه شدیدا به این آن نیاز دارم .

مرسی

AminSobati
سه شنبه 25 مرداد 1384, 00:12 صبح
این بستگی به تنوع فرمتهای استفاده شده برای ذخیره شماره ها داره. توابع زیادی برای String Processing در TSQL وجود داره که در این خصوص بهتون کمک میکنه:
LEFT, RIGHT, LEN, SUBSTRING, PATINDEX
ولی برای تکرار اولین عدد هر شماره، میتونین یک چنین دستوری استفاده کنین (با این فرض که همه شماره ها ساده هستند و فرمت خاصی ندارند):

UPDATE MyTable SET PhoneNo=LEFT(PhoneNo,1)+PhoneNo

m_reza
سه شنبه 25 مرداد 1384, 20:34 عصر
متاسفانه تنوع فرمتهای استفاده شده برای ذخیره داده ها بسیار زیاده و استثناء هم زیاد داره . با این تفاسیر فکر می کنم پیاده سازی آن با SQL یکم سخت بشه. به هر حال از راهنمایی شما ممنون. راستی آیا میشه در SQL یک آرایه تعریف کرد و یا امکان وجود به رکورد بعدی و قبلی به کمک دستورات آن وجود دارد؟

AminSobati
سه شنبه 25 مرداد 1384, 23:18 عصر
Array به مفهومی که در سایر زبانها وجود داره، خیر. ولی برای شبیه سازی، معمولا از ترکیب توابع با جداول موقتی استفاده میشه.
برای حرکت روی رکوردها میتونین از امکانات Cursor استفاده کنین.