نمایش نتایج 1 تا 18 از 18

نام تاپیک: بهترین روش برای خواندن n رکورد و قرار دادن در n*M رکورد در یک جدول ...

  1. #1

    Question بهترین روش برای خواندن n رکورد و قرار دادن در n*M رکورد در یک جدول ...

    من باید n تا رکورد رو از یک جدول به صورت الگو بگیرم و با توجه به داده های اونها (تاریخ و ساعت) محاسباتی را انجام بدم و نتیجه رو در m تا رکورد بعدی به ترتیب بزارم امکان این رو هم وجود دارد که چندین بار از رکورد های الگو استفاده کنم
    در کل شما یک تقویم کاری رو در نظر بگیرید من می خوام برای مثال 2 شیفت اول (مثلا 2هفته اول) رو به عنوان الگو بردارم و اونا رو تا آخر سال کپی کنم
    من این کار رو تو محیط دات نت انجام دادم اما سرعت پردازش پایین اومده بطوری که برای هر رکورد 1 ثانیه وقت می بره که فکر کنم خیلی زیاده!
    حالا من می خوام بدونم بهتریم روش برای این جور کار ها چی هستش
    آیا باید یک پروسیجر بنویسم و 2تا حلقه بزارم و هر بار یک سلکت که یک رکورد رو از الگو بخونه و بعد از محاسبات در رکورد مورد نظر بعدی قرار بده ؟! یا نه باید از روش دیگری مثل پوینتر ها استفاده کنم

    **که بلد هم نیستم یکی از دوستان هم قرار بود چند وقت پیش یه مقاله در این زمینه بذاره که ظاهرا از شانس ما سرش خیلی شلوغ شده و هنوز وقت نکرده آماده کنه**

  2. #2
    کاربر دائمی آواتار Maryam_y_m
    تاریخ عضویت
    مرداد 1384
    محل زندگی
    here
    پست
    138
    اگر از sql server 2005 همراه visualStudio 2005 استفاده میکنید ، به راحتی این کار را توسط CLR در قالب یک SP میتوانید انجام دهید

  3. #3
    من با vbnet2005و sql 2000 کار می کنم
    و در ضمن تاریخ ها رو به صورت میلادی و 5 رقمی ثبت می کنم مانند(01/23)
    اگر مزایای sql 2005 خیلی بیشتر از 2000 هست و اینکه من بر روی یک پروژه بزرگ کار می کنم که کار با تاریخ و محاسبات اینچنینی زیاد دارم
    اگر خیلی مهم هست به 2005 اسباب کشی کنم (در ضمن یک سوم پروژه هم انجام شده )

  4. #4
    مدیر بخش آواتار whitehat
    تاریخ عضویت
    مهر 1382
    محل زندگی
    شیراز
    پست
    2,175
    آیا شما فرمول ثابتی برای این کار دارید؟
    شما می توانید تابعی ( User Define Function ) بنویسید که فرمول را پیاده سازی کند سپس با استفاده از دستور Select داده های مورد نیاز خود را در جدول Insert کنید.لازم به ذکر است بعد از این کار حتما Performance تابع خود را تست کنید
    To follow the path:
    Look to the master
    Follow the master
    Walk with the master
    See through the master
    Become the master

  5. #5
    فرمول ثابت که چه عرض کنم تقریبا آره
    من باید داده ها رو از یک تاریخ شروع کنم به خوندن و دادهاب اون تاریخ رو بعد خوندن و محاسبه باید رو یک تاریخ دیگه بزارم و همین طور برای تاریخ های بعدی
    یعنی با هر تاریخ باید یک الگو درست کنم و تاریخ بعدی رو با اون درست کنم برای مثال من اگه 2 تا تاریخ داشه باشم که یکی ثابت هست و تغییر نمی کنه و یکی دیگه باید update بشه
    به این صورت که برای رکورد اول من تا تا تاریخ رو باید بگیرم و فاصله اونها رو بدست بیارم و بعد به تاریخی از رکورد که باید تغییر کنه اضافه کنه
    مثال

    s1. date1 =03/23 , date2=03/24
    E1. date1 =03/25 , date2=03/25

    s2. date1 =04/21 , date2=04/21
    E2. date1 =12/29 , date2=12/29


    حال اگر s1 وE1 رکورد اول و آخر برای الگو باشد و S2و E2رکورد اول و آخر برای رکورد های مدنظر برای تغییر
    نتیجه کار باید به این شکل باشد


    s2.1 date1 =04/20 , date2=04/21
    2.2 date1 =04/22 , date2=04/22
    2.3 date1 =04/22 , date2=04/23
    2.4 date1 =04/24 , date2=04/24
    ...
    E2.n date1 =12/2x , date2=12/29

    که در این الگو یک روز تاریخ اول یکی کمتر باید بشه و یک روز باید برابر بشه
    تاریخ دوم ثابت هست البته من مثل تاریخ اول 3 تا تاریخ دیگه هم دارم که باید همین طور مخاسبه بشه

  6. #6
    من یک sp برای این کار نصفه و نیمه آماده کردم اما می دونم که خیلی اشکال داره اینجا می زارم تا دوستان هر کی می تونه در کامل کردنش کمک کنه

    USE bac
    GO

    DECLARE Olgo_cursor CURSOR FOR
    DECLARE Replace_cursor CURSOR FOR

    DECLARE @DBEGINDATE1 char(5), @EBEGINDATE1 char(5)
    DECLARE @DBEGINDATE2 char(5), @EBEGINDATE2 char(5)
    declare @ReplaceEDate char(5)

    SELECT DBEGINDATE,EBEGINDATE
    FROM ShiftItemDef
    WHERE (TypeShiftId = 1) AND (DBEGINDATE BETWEEN '03/24' AND '03/25')
    ORDER BY DBEGINDATE
    OPEN Olgo_cursor

    FETCH NEXT FROM Olgo_cursor
    INTO @DBEGINDATE1,@EBEGINDATE1

    SELECT DBEGINDATE,EBEGINDATE
    FROM ShiftItemDef
    WHERE (TypeShiftId = 1) AND (DBEGINDATE BETWEEN '04/21' AND '12/29')
    ORDER BY DBEGINDATE
    OPEN Replace_cursor

    FETCH NEXT FROM Replace_cursor
    INTO @DBEGINDATE2,@EBEGINDATE2

    WHILE @@FETCH_STATUS = 0
    BEGIN
    set @ReplaceEDate = dbo.MyCustomFunction(@DBEGINDATE1,@EBEGINDATE1,@DB EGINDATE2)
    EXEC('UPDATE ' + Replace_cursor + ' SET EBEGINDATE = '@ReplaceEDate+' WHERE DBEGINDATE = ' +@DBEGINDATE2)

    FETCH NEXT FROM Replace_cursor
    INTO @EBEGINDATE2
    END

    CLOSE Olgo_cursor
    CLOSE Replace_cursor
    DEALLOCATE Olgo_cursor
    DEALLOCATE Replace_cursor
    GO


    من از کرسر ها استفاده کردم از2 تا کرسر که اصلا نمی دونم درسته یا نه یکی رکورد های الگو رو انتخاب کنه و یکی رکورد هایی رو که باید تغییر کنند !
    البته باید وقتی به انتهای رکرود انتخاب در الگو برسه باید برگرده از اول شروع کنه تا اینکه رکورد ها در کرسر دومی(کرسری که باید تغییر کنه) به پایان برسه که اونو نتونستم پیاده سازی کنم
    اساتید لطفا کمک کنیییییییییییید

  7. #7
    راه حل این موضوع رابطه مستقیم با دیتابیس هست ، نه دیتاست چون رابطه مستقم از غیر مستقیم خیلی بالاتره
    یعنی از SQLDatareader استفاده کنید

  8. #8
    خوب من کد رو به این شکل تغییر دادم در اینحا از یک کرسر و دو حلقه استفاده کردم
    اما باز مشکل داره ،انگار وارد حلقه بینهایت میشه

    CREATE PROCEDURE [SpCopyFromUntilDefShift]
    ( @IdShift numeric,
    @SDateOlgo [char](5),
    @EDateOlgo [char](5),
    @SDateRep [char](5),
    @EDateRep [char](5),
    @YearDate int
    )
    AS
    declare @NoDayOlgo int, @NoDayPeriod int, @I int
    declare @strTemp Char(20), @strTemp2 char(20)

    set @strTemp=dbo.Persian2Civil(@YearDate ,substring( @SDateRep,1,2),substring( @SDateRep,4,2))
    set @strTemp2=dbo.Persian2Civil(@YearDate ,substring( @EDateRep,1,2),substring( @EDateRep,4,2))
    set @i = DATEDIFF(day,@strTemp,@strTemp2 )

    set @strTemp=dbo.Persian2Civil(@YearDate ,substring( @SDateOlgo,1,2),substring( @SDateOlgo,4,2))
    set @strTemp2=dbo.Persian2Civil(@YearDate ,substring( @EDateOlgo,1,2),substring( @EDateOlgo,4,2))

    set @NoDayOlgo = DATEDIFF(day,@strTemp,@strTemp2) + 1
    set @NoDayPeriod = Cast((@i / @NoDayOlgo)as int)

    declare @DBEGINDATECur char(5),@DBEGINDATEOlgo char(5)
    declare @DBEGINDATE char(5), @BBEGINDATE char(5), @BBEGINTIME char(5), @BENDDATE char(5), @BENDTIME char(5), @DBEGINTIME char(5), @DENDDATE char(5)
    declare @DENDTIME char(5), @EBEGINTIME char(5), @EBEGINDATE char(5), @EENDDATE char(5), @EENDTIME char(5), @ENDDATE char(5), @ENDTIME char(5)
    declare @HOLIDAY int


    set @DBEGINDATECur =@SDateRep
    set @DBEGINDATEOlgo =@SDateOlgo

    WHILE @DBEGINDATECur < = @EDateRep
    BEGIN
    WHILE @i =@NoDayOlgo-1
    BEGIN
    --تعریف کرسر
    DECLARE Cursor1 CURSOR FOR
    SELECT DBEGINDATE,BBEGINDATE, BBEGINTIME, BENDDATE, BENDTIME, DBEGINTIME,
    DENDDATE, DENDTIME, EBEGINTIME, EBEGINDATE, EENDDATE, EENDTIME, ENDDATE, ENDTIME, HOLIDAY
    FROM dbo.ShiftItemDef
    WHERE (TypeShiftId = @IdShift) AND (DBEGINDATE =@DBEGINDATEOlgo )
    OPEN Cursor1

    FETCH next FROM Cursor1 INTO @DBEGINDATEOlgo,@BBEGINDATE, @BBEGINTIME, @BENDDATE, @BENDTIME, @DBEGINTIME, @DENDDATE,
    @DENDTIME, @EBEGINTIME, @EBEGINDATE, @EENDDATE, @EENDTIME, @ENDDATE, @ENDTIME, @HOLIDAY

    --تا زمانی که رکوردی وجود دارد
    WHILE @@FETCH_STATUS = 0
    BEGIN
    set @BBEGINDATE =dbo.ReturnNewDate(@DBEGINDATEOlgo,@BBEGINDATE,@DB EGINDATECur,@YearDate)
    set @BENDDATE =dbo.ReturnNewDate(@DBEGINDATEOlgo,@BENDDATE,@DBEG INDATECur,@YearDate)
    set @DENDDATE =dbo.ReturnNewDate(@DBEGINDATEOlgo,@DENDDATE,@DBEG INDATECur,@YearDate)
    set @EBEGINDATE =dbo.ReturnNewDate(@DBEGINDATEOlgo,@EBEGINDATE,@DB EGINDATECur,@YearDate)
    set @EENDDATE =dbo.ReturnNewDate(@DBEGINDATEOlgo,@EENDDATE,@DBEG INDATECur,@YearDate)
    set @ENDDATE =dbo.ReturnNewDate(@DBEGINDATEOlgo,@ENDDATE,@DBEGI NDATECur,@YearDate)

    UPDATE ShiftItemDef
    SET BBEGINDATE =@BBEGINDATE, BBEGINTIME =@BBEGINTIME, BENDDATE =@BENDDATE, BENDTIME =@BENDTIME, DBEGINTIME =@DBEGINTIME, DENDDATE =@DENDDATE,
    DENDTIME =@DENDTIME, EBEGINTIME =@EBEGINTIME, EBEGINDATE =@EBEGINDATE,
    EENDDATE =@EENDDATE, EENDTIME =@EENDTIME, ENDDATE =@ENDDATE, ENDTIME =@ENDTIME, HOLIDAY =@HOLIDAY
    WHERE (TypeShiftId = @IdShift) AND (DBEGINDATE =@DBEGINDATECur )
    /**/
    set @i=@i+1

    set @strTemp2=dbo.Persian2Civil(@YearDate ,substring( @DBEGINDATECur,1,2),substring( @DBEGINDATECur,4,2))
    set @strTemp2 = DATEADD(day,1,@strTemp2)
    set @strTemp2 = CAST(lTRIM(DATEPART(month,@strTemp2)) AS varchar(2))+ '/' +CAST(substring(@StrTemp2,5,2) AS varchar(2))+ '/' +CAST(substring(@StrTemp2,8,4) AS char(4))
    set @strTemp2 =dbo.Civil2Persian(@strTemp2)
    set @DBEGINDATECur = CAST(substring(@StrTemp2,6,5) AS varchar(5))

    set @strTemp2=dbo.Persian2Civil(@YearDate ,substring( @DBEGINDATEOlgo,1,2),substring( @DBEGINDATEOlgo,4,2))
    set @strTemp2 = DATEADD(day,1,@strTemp2)
    set @strTemp2 = CAST(lTRIM(DATEPART(month,@strTemp2)) AS varchar(2))+ '/' +CAST(substring(@StrTemp2,5,2) AS varchar(2))+ '/' +CAST(substring(@StrTemp2,8,4) AS char(4))
    set @strTemp2 =dbo.Civil2Persian(@strTemp2)
    set @DBEGINDATEOlgo = CAST(substring(@StrTemp2,6,5) AS varchar(5))

    FETCH next FROM Cursor1 INTO @DBEGINDATEOlgo,@BBEGINDATE, @BBEGINTIME, @BENDDATE, @BENDTIME, @DBEGINTIME, @DENDDATE,
    @DENDTIME, @EBEGINTIME, @EBEGINDATE, @EENDDATE, @EENDTIME, @ENDDATE, @ENDTIME, @HOLIDAY

    END
    CLOSE Cursor1
    DEALLOCATE Cursor1
    END

    END
    GO


    در ضمن در این تاپیک هم در مورد یک قسمتی از موضوع بحث شد که جواب اونو تا حدی گرفتم
    https://barnamenevis.org/showthread.php?t=59128

  9. #9
    خوب من با یک کرسر و 2 تا حلقه مشکلم رو حل کردم 365 رکورد در 7 ثانیه مشکل کد بالا در حلقه بود که باید یکمی دست کاری میشد.
    اما باز هم فکر کنم زیاد هست
    می تونید کمک کنید این رو با یک حلق و یک کرسر که حاوی چند رکرود هست انجام بدم ؟
    مشکل من اینکه چطوری کرسر رو دستی حلو ببرم و هر موقع به آخرین رکرورد رسد اونو به اولین رکرود برگردونم؟؟

  10. #10
    مدیر بخش آواتار whitehat
    تاریخ عضویت
    مهر 1382
    محل زندگی
    شیراز
    پست
    2,175
    دوست عزیز من چند بار صورت مسئله را خواندم اما هنوز نفهمیدم دقیقا شما چه کار می خواهید انجام دهید.تنها موردی که فهمیدم اینه که شما می خواهید از یکسری داده در جدول ، مقادیری را برای همان جدول پیدا کنید و Update کنید.لطفا در این مورد بیشتر توضیح دهید(با توجه به کدی که نوشتید شاید نیاز به کرسر نباشه)
    کدی که شما نوشتید یک اشتباه بزرگ داره و اون تعریف کرسر در حلقه while هست که با اجرای این حلقه یک کرسر تعریف میشه که مشکل ممکنه درست کنه.
    To follow the path:
    Look to the master
    Follow the master
    Walk with the master
    See through the master
    Become the master

  11. #11
    درسته من می خوام یکسری داده را در جدول از تاریخ تا تاریخ پیدا کنم و از اونها استفاده کنم و داده های از تاریخ تا تاریخ دیگر رو تغییر بدم درسته کرسر من داخل حلقه باز و بسته می شه که با توجه اما میشه یک کرسر نوشت که اون اطلاعات از تاریخ تا تاریخ اول رو بگیره و با استفاده از یک رکورد اون یک رکورد در خروجی از تاریخ تا تاریخ دوم رو پر کنه و اگه به آخر رکورد های انتخابی از تاریخ تا تاریخ اول تموم شد و بازه دوم هنوز مانده بود بره از اول شروع کنه به خوندم
    یعنی به ازای یک رکورد از الگو حداقل یک رکورد برای update دارم
    مشکل من الان اینکه نمی تونم کرسر رو کنترل کنم یعنی یکی یکی جلو ببرم و هر موقع خواستم ببرم به اول اگه اینو بتونم می تونم کرسر رو در بیرون حلقه درست کنم

  12. #12
    مدیر بخش آواتار whitehat
    تاریخ عضویت
    مهر 1382
    محل زندگی
    شیراز
    پست
    2,175
    برای مشکل فعلی شما کافیه شرط حلقه را بر اساس کرسر انتخاب نکنید.
    کرسر خود را نوع SCROLL انتخاب کنید و با دستور

    FETCH PRIOR FROM .... INTO ...
    FETCH FIRST FROM .... INTO ...
    FETCH LAST FROM .... INTO ...
    کرسر خود را جابجا کنید
    (تابع ReturnNewDate چه عملی انجام می دهد)
    To follow the path:
    Look to the master
    Follow the master
    Walk with the master
    See through the master
    Become the master

  13. #13
    آخه من مجبورم که در داخل حلقه از خروجی های کرسر استفاده کنم و در داخل حلقه اونو حرکت بدم اما می خواخم اونو قبل حلقه پرکنم
    اگه می شه یه مثال کوچولو بزنید.

  14. #14
    مدیر بخش آواتار whitehat
    تاریخ عضویت
    مهر 1382
    محل زندگی
    شیراز
    پست
    2,175

    DECLARE MyCursor Cursor
    SCROLL
    FOR
    Select DBEGINDATE,EBEGINDATE From ShiftItemDef
    WHERE (TypeShiftId = 1) AND (DBEGINDATE BETWEEN '03/24' AND '03/25')

    OPEN MyCursor
    FETCH NEXT FROM MyCursor
    INTO @DBEGINDATE1,@EBEGINDATE1
    ---------------------------------------------------
    While (Condition)
    ...
    ...
    FETCH NEXT FROM MyCursor
    INTO @DBEGINDATE1,@EBEGINDATE1
    END
    ---------------------------------------------------
    CLOSE MyCursor
    DEALLOCATE MyCursor
    این برای تعریف یک کرسر و پیمایش آن در یک حلقه است.حالا شما بفرمائید چه فیلد هایی نیاز دارید و باید برای آنها چه عملی انجام دهید.(توجه کنید Declare کرسر خارج حلقه است)
    و چه فیلدهایی باید بروز رسانی شود (شرط Update)
    آخرین ویرایش به وسیله whitehat : یک شنبه 24 دی 1385 در 11:09 صبح دلیل: تصحیح املای SCROLL
    To follow the path:
    Look to the master
    Follow the master
    Walk with the master
    See through the master
    Become the master

  15. #15
    سلام
    ممنون از توجه شما
    من پروسیجر را به این شکل تغییر دادم اما سر SCRLL 'گیر می ده می گه اینو نمیشناسم؟!
    ***من با SQL2000 کار می کنم **

    CREATE PROCEDURE [SpCopyFromUntilDefShift1]
    ( @IdShift numeric,
    @SDateOlgo [char](5),
    @EDateOlgo [char](5),
    @SDateRep [char](5),
    @EDateRep [char](5),
    @YearDate int
    )
    AS
    declare @NoDayOlgo int, @NoDayPeriod int, @I int
    declare @strTemp Char(20), @strTemp2 char(20)

    set @strTemp=dbo.Persian2Civil(@YearDate ,substring( @SDateRep,1,2),substring( @SDateRep,4,2))
    set @strTemp2=dbo.Persian2Civil(@YearDate ,substring( @EDateRep,1,2),substring( @EDateRep,4,2))
    set @i = DATEDIFF(day,@strTemp,@strTemp2 )

    set @strTemp=dbo.Persian2Civil(@YearDate ,substring( @SDateOlgo,1,2),substring( @SDateOlgo,4,2))
    set @strTemp2=dbo.Persian2Civil(@YearDate ,substring( @EDateOlgo,1,2),substring( @EDateOlgo,4,2))

    set @NoDayOlgo = DATEDIFF(day,@strTemp,@strTemp2) + 1
    set @NoDayPeriod = Cast((@i / @NoDayOlgo)as int)

    declare @DBEGINDATECur char(5)--,@DBEGINDATEOlgo char(5)
    declare @DBEGINDATE char(5), @BBEGINDATE char(5), @BBEGINTIME char(5), @BENDDATE char(5), @BENDTIME char(5), @DBEGINTIME char(5), @DENDDATE char(5)
    declare @DENDTIME char(5), @EBEGINTIME char(5), @EBEGINDATE char(5), @EENDDATE char(5), @EENDTIME char(5), @ENDDATE char(5), @ENDTIME char(5)
    declare @HOLIDAY int


    set @DBEGINDATECur =@SDateRep
    --set @DBEGINDATEOlgo =@SDateOlgo
    --------------
    DECLARE MyCursor Cursor
    SCRLL
    FOR
    Select DBEGINDATE, BBEGINDATE, BBEGINTIME, BENDDATE, BENDTIME, DBEGINTIME,
    DENDDATE, DENDTIME, EBEGINTIME, EBEGINDATE, EENDDATE, EENDTIME, ENDDATE, ENDTIME, HOLIDAY
    FROM dbo.ShiftItemDef
    WHERE (TypeShiftId = @IdShift) AND (DBEGINDATE BETWEEN @SDateOlgo AND @EDateOlgo)

    OPEN MyCursor
    FETCH NEXT FROM MyCursor
    INTO @DBEGINDATE,@BBEGINDATE, @BBEGINTIME, @BENDDATE, @BENDTIME, @DBEGINTIME, @DENDDATE,
    @DENDTIME, @EBEGINTIME, @EBEGINDATE, @EENDDATE, @EENDTIME, @ENDDATE, @ENDTIME, @HOLIDAY

    --------------
    WHILE @DBEGINDATECur < = @EDateRep
    BEGIN

    set @BBEGINDATE =dbo.ReturnNewDate(@DBEGINDATE,@BBEGINDATE,@DBEGIN DATECur,@YearDate)
    set @BENDDATE =dbo.ReturnNewDate(@DBEGINDATE,@BENDDATE,@DBEGINDA TECur,@YearDate)
    set @DENDDATE =dbo.ReturnNewDate(@DBEGINDATE,@DENDDATE,@DBEGINDA TECur,@YearDate)
    set @EBEGINDATE =dbo.ReturnNewDate(@DBEGINDATE,@EBEGINDATE,@DBEGIN DATECur,@YearDate)
    set @EENDDATE =dbo.ReturnNewDate(@DBEGINDATE,@EENDDATE,@DBEGINDA TECur,@YearDate)
    set @ENDDATE =dbo.ReturnNewDate(@DBEGINDATE,@ENDDATE,@DBEGINDAT ECur,@YearDate)

    UPDATE ShiftItemDef
    SET BBEGINDATE =@BBEGINDATE, BBEGINTIME =@BBEGINTIME, BENDDATE =@BENDDATE, BENDTIME =@BENDTIME, DBEGINTIME =@DBEGINTIME, DENDDATE =@DENDDATE,
    DENDTIME =@DENDTIME, EBEGINTIME =@EBEGINTIME, EBEGINDATE =@EBEGINDATE,
    EENDDATE =@EENDDATE, EENDTIME =@EENDTIME, ENDDATE =@ENDDATE, ENDTIME =@ENDTIME, HOLIDAY =@HOLIDAY
    WHERE (TypeShiftId = @IdShift) AND (DBEGINDATE =@DBEGINDATECur )
    /**/
    set @i=@i+1
    if @DBEGINDATECur= @EDateRep
    begin
    set @DBEGINDATECur='12/31'
    break
    end
    else
    begin
    set @strTemp2=dbo.Persian2Civil(@YearDate ,substring( @DBEGINDATECur,1,2),substring( @DBEGINDATECur,4,2))
    set @strTemp2 = DATEADD(day,1,@strTemp2)
    set @strTemp2 = CAST(lTRIM(DATEPART(month,@strTemp2)) AS varchar(2))+ '/' +CAST(substring(@StrTemp2,5,2) AS varchar(2))+ '/' +CAST(substring(@StrTemp2,8,4) AS char(4))
    set @strTemp2 =dbo.Civil2Persian(@strTemp2)
    set @DBEGINDATECur = CAST(substring(@StrTemp2,6,5) AS varchar(5))

    END
    if @DBEGINDATE =@EDateOlgo
    FETCH first FROM MyCursor INTO @DBEGINDATE, @BBEGINDATE, @BBEGINTIME, @BENDDATE, @BENDTIME, @DBEGINTIME, @DENDDATE,
    @DENDTIME, @EBEGINTIME, @EBEGINDATE, @EENDDATE, @EENDTIME, @ENDDATE, @ENDTIME, @HOLIDAY
    else
    FETCH next FROM MyCursor INTO @DBEGINDATE, @BBEGINDATE, @BBEGINTIME, @BENDDATE, @BENDTIME, @DBEGINTIME, @DENDDATE,
    @DENDTIME, @EBEGINTIME, @EBEGINDATE, @EENDDATE, @EENDTIME, @ENDDATE, @ENDTIME, @HOLIDAY

    END
    CLOSE MyCursor
    DEALLOCATE MyCursor
    GO


    در ضمن وقتی از متدBREAK در IF استفاده می کنم فقط از شرط میاد بیرون در حالی که من می خوام از حلقه خارج بشه؟

  16. #16
    اینو پیدا کردم بذار تست کنم SCRLL=SCROLL
    آقا مشکلم حل شد خیلی خوب شد
    برای 365 رکورد از 7-8 ثانیه رسید به 2 ثانیه
    یکی طلبت مهندس

  17. #17
    یه مشکل جدید
    من در بالا تابعی به نام ReturnNewDate داشتم که اونو برای تست همون مقدار ورودی رو می زاشتم بدون محاسبه
    اما حالا که اونو کامل می کنم مقدار زمان از 2 به 6 ثانیه می رسه در اون تابع من مقدار ورودی رو به فرمت کامل تاریخ شمسی و بعد میلادی تبدیل و محاسبه رو انجام می دم بعد دوباره به فرمت مورد نظر در شمسی بر می گردونم
    اینم کدش که تبدیل تاریخ ها رو با توابع دوستمون LINUX انجام می دم
    اینطوری

    CREATE FUNCTION dbo.ReturnNewDate(@DBEGINDATE varchar (17),@IdxDATE varchar (17),@DBEGINDATECur varchar (17),@YearDate int)
    RETURNS char(5) AS
    BEGIN
    --to miladi
    set @DBEGINDATE=dbo.Persian2Civil(@YearDate ,substring( @DBEGINDATE,1,2),substring( @DBEGINDATE,4,2))
    set @IdxDATE=dbo.Persian2Civil(@YearDate ,substring( @IdxDATE,1,2),substring( @IdxDATE,4,2))
    set @DBEGINDATECur=dbo.Persian2Civil(@YearDate ,substring( @DBEGINDATECur,1,2),substring( @DBEGINDATECur,4,2))
    --add diff
    set @DBEGINDATECur= DATEADD(day,DATEDIFF(day, @DBEGINDATE,@IdxDATE ),@DBEGINDATECur)
    --to Persian
    set @IdxDATE = CAST(lTRIM(DATEPART(month,@DBEGINDATECur)) AS varchar(2))+ '/' +CAST(substring(@DBEGINDATECur,5,2) AS varchar(2))+ '/' +CAST(substring(@DBEGINDATECur,8,4) AS char(4))
    set @IdxDATE =dbo.Civil2Persian(@IdxDATE)
    set @IdxDATE = CAST(substring(@IdxDATE,6,5) AS varchar(5))

    RETURN @IdxDATE
    END


    نمی شه بهینه تر بشه؟!

  18. #18
    مدیر بخش آواتار whitehat
    تاریخ عضویت
    مهر 1382
    محل زندگی
    شیراز
    پست
    2,175
    بطور کلی استفاده از توابع سرعت اجرا را بسیار پائین می آورد.الان شما چند تابع را در هم صدا زدید بهتره سعی کنید توابع در یک سطح باشند و یا این کارها را در SP انجام بدید.بعدا میام تابع را می خوانم شاید بشه بهینه تر کرد:)
    To follow the path:
    Look to the master
    Follow the master
    Walk with the master
    See through the master
    Become the master

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •