I am very new to SQL Server and finally got my code to run, but its very slow. My database is a bit on the big side (1.22mill rows, 3 columns) and I have some while loops, which I know isn't ideal but I couldn't find a way around it.
Any help would be greatly appreciated!!!
declare @b float
declare @c float
declare @dateloopfora datetime
declare @dateloopforc datetime
BEGIN
SET @MYCURSOR = CURSOR FOR
SELECT DISTINCT [STOCKS] FROM [tsxvPrices].[dbo].[3coldata]
OPEN @MYCURSOR
FETCH NEXT FROM @MYCURSOR INTO @STOCK
set @end = '12/30/2012'
WHILE @@FETCH_STATUS = 0
BEGIN
print ('Stockname restart: ' + @stock)
SET @dateloop = '01/01/2012'
WHILE (@dateloop <= @end)
BEGIN
set @datedelta = 0
SET @dateloop = dateadd(day,1,@dateloop)
set @b = (SELECT [val] FROM [tsxvPrices].[dbo].[3coldata] WHERE( [dates] = @dateloop and [stocks] = @stock))
WHILE (@datedelta < 4)
BEGIN
set @datedelta = @datedelta + 1
if (@b is null)
begin
SET @dateloop = dateadd(day,1,@dateloop)
set @b = (SELECT [val] FROM [tsxvPrices].[dbo].[3coldata] WHERE( [dates] = @dateloop and [stocks] = @STOCK))
/*print ('b= ' + cast( @b as varchar(10)) + ' dateadd1=' + cast( @datedelta as varchar(10))) */
end
END
SET @datedelta = 0
set @a = (SELECT [val] FROM [tsxvPrices].[dbo].[3coldata] WHERE( [dates] = dateadd(day,-1,@dateloop) and [stocks] = @stock))
set @c = (SELECT [val] FROM [tsxvPrices].[dbo].[3coldata] WHERE( [dates] = dateadd(day,+96,@dateloop) and [stocks] = @stock))
if @b/@a < 0.8
begin
WHILE (@datedelta < 4)
BEGIN
set @datedelta = @datedelta + 1
if (@a is null)
begin
SET @dateloopfora = dateadd(day,-@datedelta,@dateloop)
set @a = (SELECT [val] FROM [tsxvPrices].[dbo].[3coldata] WHERE( [dates] = @dateloopfora and [stocks] = @STOCK))
/*print ('b= ' + cast( @b as varchar(10)) + ' dateadd1=' + cast( @datedelta as varchar(10))) */
end
if (@c is null)
begin
SET @dateloopforc = dateadd(day,96+@datedelta,@dateloop)
set @c = (SELECT [val] FROM [tsxvPrices].[dbo].[3coldata] WHERE( [dates] = @dateloopforc and [stocks] = @STOCK))
/*print ('b= ' + cast( @b as varchar(10)) + ' dateadd1=' + cast( @datedelta as varchar(10))) */
end
END
/*print ('Stockname: ' + @stock)
print @dateloop
print('daily')
print @b/@a
print ('quarterly')*/
print @c/@b
/*print ('======================')*/
end
END
FETCH NEXT FROM @MYCURSOR INTO @STOCK
END
CLOSE @MYCURSOR
DEALLOCATE @MYCURSOR