PDA

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



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

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

Maryam_y_m
چهارشنبه 20 دی 1385, 10:20 صبح
اگر از sql server 2005 همراه visualStudio 2005 استفاده میکنید ، به راحتی این کار را توسط CLR در قالب یک SP میتوانید انجام دهید

rezaei manesh
چهارشنبه 20 دی 1385, 10:37 صبح
من با vbnet2005و sql 2000 کار می کنم
و در ضمن تاریخ ها رو به صورت میلادی و 5 رقمی ثبت می کنم مانند(01/23)
اگر مزایای sql 2005 خیلی بیشتر از 2000 هست و اینکه من بر روی یک پروژه بزرگ کار می کنم که کار با تاریخ و محاسبات اینچنینی زیاد دارم
اگر خیلی مهم هست به 2005 اسباب کشی کنم (در ضمن یک سوم پروژه هم انجام شده )

whitehat
چهارشنبه 20 دی 1385, 11:47 صبح
آیا شما فرمول ثابتی برای این کار دارید؟
شما می توانید تابعی ( User Define Function ) بنویسید که فرمول را پیاده سازی کند سپس با استفاده از دستور Select داده های مورد نیاز خود را در جدول Insert کنید.لازم به ذکر است بعد از این کار حتما Performance تابع خود را تست کنید

rezaei manesh
چهارشنبه 20 دی 1385, 14:14 عصر
فرمول ثابت که چه عرض کنم تقریبا آره
من باید داده ها رو از یک تاریخ شروع کنم به خوندن و دادهاب اون تاریخ رو بعد خوندن و محاسبه باید رو یک تاریخ دیگه بزارم و همین طور برای تاریخ های بعدی
یعنی با هر تاریخ باید یک الگو درست کنم و تاریخ بعدی رو با اون درست کنم برای مثال من اگه 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 تا تاریخ دیگه هم دارم که باید همین طور مخاسبه بشه

rezaei manesh
چهارشنبه 20 دی 1385, 19:05 عصر
من یک 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 تا کرسر که اصلا نمی دونم درسته یا نه یکی رکورد های الگو رو انتخاب کنه و یکی رکورد هایی رو که باید تغییر کنند !
البته باید وقتی به انتهای رکرود انتخاب در الگو برسه باید برگرده از اول شروع کنه تا اینکه رکورد ها در کرسر دومی(کرسری که باید تغییر کنه) به پایان برسه که اونو نتونستم پیاده سازی کنم
اساتید لطفا کمک کنیییییییییییید

leG_big
پنج شنبه 21 دی 1385, 11:00 صبح
راه حل این موضوع رابطه مستقیم با دیتابیس هست ، نه دیتاست چون رابطه مستقم از غیر مستقیم خیلی بالاتره
یعنی از SQLDatareader استفاده کنید

rezaei manesh
شنبه 23 دی 1385, 12:03 عصر
خوب من کد رو به این شکل تغییر دادم در اینحا از یک کرسر و دو حلقه استفاده کردم
اما باز مشکل داره ،انگار وارد حلقه بینهایت میشه


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


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

rezaei manesh
شنبه 23 دی 1385, 18:55 عصر
خوب من با یک کرسر و 2 تا حلقه مشکلم رو حل کردم 365 رکورد در 7 ثانیه مشکل کد بالا در حلقه بود که باید یکمی دست کاری میشد.
اما باز هم فکر کنم زیاد هست
می تونید کمک کنید این رو با یک حلق و یک کرسر که حاوی چند رکرود هست انجام بدم ؟
مشکل من اینکه چطوری کرسر رو دستی حلو ببرم و هر موقع به آخرین رکرورد رسد اونو به اولین رکرود برگردونم؟؟

whitehat
شنبه 23 دی 1385, 22:22 عصر
دوست عزیز من چند بار صورت مسئله را خواندم اما هنوز نفهمیدم دقیقا شما چه کار می خواهید انجام دهید.تنها موردی که فهمیدم اینه که شما می خواهید از یکسری داده در جدول ، مقادیری را برای همان جدول پیدا کنید و Update کنید.لطفا در این مورد بیشتر توضیح دهید(با توجه به کدی که نوشتید شاید نیاز به کرسر نباشه)
کدی که شما نوشتید یک اشتباه بزرگ داره و اون تعریف کرسر در حلقه while هست که با اجرای این حلقه یک کرسر تعریف میشه که مشکل ممکنه درست کنه.

rezaei manesh
یک شنبه 24 دی 1385, 08:15 صبح
درسته من می خوام یکسری داده را در جدول از تاریخ تا تاریخ پیدا کنم و از اونها استفاده کنم و داده های از تاریخ تا تاریخ دیگر رو تغییر بدم درسته کرسر من داخل حلقه باز و بسته می شه که با توجه اما میشه یک کرسر نوشت که اون اطلاعات از تاریخ تا تاریخ اول رو بگیره و با استفاده از یک رکورد اون یک رکورد در خروجی از تاریخ تا تاریخ دوم رو پر کنه و اگه به آخر رکورد های انتخابی از تاریخ تا تاریخ اول تموم شد و بازه دوم هنوز مانده بود بره از اول شروع کنه به خوندم
یعنی به ازای یک رکورد از الگو حداقل یک رکورد برای update دارم
مشکل من الان اینکه نمی تونم کرسر رو کنترل کنم یعنی یکی یکی جلو ببرم و هر موقع خواستم ببرم به اول اگه اینو بتونم می تونم کرسر رو در بیرون حلقه درست کنم

whitehat
یک شنبه 24 دی 1385, 09:57 صبح
برای مشکل فعلی شما کافیه شرط حلقه را بر اساس کرسر انتخاب نکنید.
کرسر خود را نوع SCROLL انتخاب کنید و با دستور


FETCH PRIOR FROM .... INTO ...
FETCH FIRST FROM .... INTO ...
FETCH LAST FROM .... INTO ...
کرسر خود را جابجا کنید
(تابع ReturnNewDate چه عملی انجام می دهد)

rezaei manesh
یک شنبه 24 دی 1385, 10:16 صبح
آخه من مجبورم که در داخل حلقه از خروجی های کرسر استفاده کنم و در داخل حلقه اونو حرکت بدم اما می خواخم اونو قبل حلقه پرکنم
اگه می شه یه مثال کوچولو بزنید.

whitehat
یک شنبه 24 دی 1385, 10:33 صبح
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)

rezaei manesh
یک شنبه 24 دی 1385, 11:01 صبح
سلام
ممنون از توجه شما
من پروسیجر را به این شکل تغییر دادم اما سر 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 استفاده می کنم فقط از شرط میاد بیرون در حالی که من می خوام از حلقه خارج بشه؟

rezaei manesh
یک شنبه 24 دی 1385, 11:06 صبح
اینو پیدا کردم بذار تست کنم SCRLL=SCROLL
آقا مشکلم حل شد خیلی خوب شد
برای 365 رکورد از 7-8 ثانیه رسید به 2 ثانیه
یکی طلبت مهندس

rezaei manesh
یک شنبه 24 دی 1385, 15:15 عصر
یه مشکل جدید
من در بالا تابعی به نام 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


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

whitehat
یک شنبه 24 دی 1385, 15:43 عصر
بطور کلی استفاده از توابع سرعت اجرا را بسیار پائین می آورد.الان شما چند تابع را در هم صدا زدید بهتره سعی کنید توابع در یک سطح باشند و یا این کارها را در SP انجام بدید.بعدا میام تابع را می خوانم شاید بشه بهینه تر کرد:)