Click here to Skip to main content
15,891,943 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more:
I get the must declare scalar variable @FirstTableMonth error.

Here is my code:

alter PROCEDURE stp3_getDataFrom11Tables
(
@FirstTableMonth int,
@LinkedServerName sysname = 'Server1'
)
AS

DECLARE
@DynamicSQL nvarchar(max) = '',
@DynamicSQL2 nvarchar(max) = '',
@OpenQuerySql nvarchar(max),
@Table_Name sysname,
@Table_Name2 sysname,
@TableMonth int,
@TableMonth2 int ,
@CurrentMonth int = 0,
@NextYearMonth int = 1,
@part2 nvarchar(max) = ''


WHILE @CurrentMonth < 11
BEGIN

SELECT @TableMonth = CASE WHEN (@FirstTableMonth + @CurrentMonth) % 100 < 13 THEN
@FirstTableMonth + @CurrentMonth
ELSE
@FirstTableMonth + 100 - (@FirstTableMonth % 100) + @NextYearMonth
END,
@NextYearMonth = CASE WHEN (@FirstTableMonth + @CurrentMonth) % 100 < 13 THEN
@NextYearMonth
ELSE
@NextYearMonth + 1
END,
@Table_Name = 'xx'+CAST(@TableMonth as varchar)+'_T' ,

@TableMonth2 = @TableMonth+ 1,
@Table_Name2 = 'xx'+CAST(@TableMonth2 as varchar)+'_T' ,
--@TableMonth2 = CAST(@TableMonth2 as varchar),
--print @TableMonth2


@DynamicSQL = @DynamicSQL + 'SELECT *
FROM '+ @Table_Name + ' WHERE co_cde = 15
and cust_no in (123
) '+ CASE WHEN @CurrentMonth < 10 THEN ' UNION ALL ' ELSE '' END ,


@DynamicSQL2 = @DynamicSQL2 + 'SELECT *
FROM '+ @Table_Name2 + ' where
cust_no in (123
) ' + CASE WHEN @CurrentMonth < 10 THEN ' UNION ALL ' ELSE '' END ,


@part2 = @part2 + 'SELECT *
FROM OPENQUERY(Server1," SELECT *
FROM xx
where cust_no in (123
) "

)'



SET @CurrentMonth = @CurrentMonth + 1
IF OBJECT_ID('tempdb..#TEMP') IS NOT NULL BEGIN DROP TABLE #TEMP END
--last months snapshot
SELECT *,
cast(ODATE as datetime) as open_date
into #temp
FROM OPENQUERY(Server1,' SELECT *
cast(ODATE as datetime) as open_date
FROM xx WHERE cust_no in (123
) '
)
--if equal to month + 99 = previous month then union 11 tables with last months snapshot
--else
--union 11 tables with 12th table
SET @OpenQuerySql = 'IF (@FirstTableMonth+99) = CONVERT(nvarchar(6), dateadd(month,-1,GETDATE()), 112)
BEGIN
SELECT *
FROM OPENQUERY(['+ @LinkedServerName +'], '''+ @DynamicSQL + ''' )
UNION ALL
SELECT *
FROM #temp
end
else IF (201404+99) <> CONVERT(nvarchar(6), dateadd(month,-1,GETDATE()), 112)
begin

SELECT *
FROM OPENQUERY(['+ @LinkedServerName +'], '''+ @DynamicSQL + ''' )
UNION ALL
SELECT *
FROM OPENQUERY(['+ @LinkedServerName +'], '''+ @DynamicSQL2 + ''' )
end
'
END
EXEC sp_executesql @OpenQuerySql
GO
Posted

Remove the brackets () after stp3_getDataFrom11Tables and try again.
 
Share this answer
 
Comments
Miss R 20-Nov-15 4:11am    
Nope, stil get the error
C#
alter PROCEDURE stp3_getDataFrom11Tables
@FirstTableMonth int=0,
@LinkedServerName sysname = 'Server1'
AS
DECLARE 
@DynamicSQL nvarchar(max) = '',
@DynamicSQL2 nvarchar(max) = '',
@OpenQuerySql nvarchar(max),
@Table_Name sysname,
@Table_Name2 sysname,
@TableMonth int,
@TableMonth2 int ,
@CurrentMonth int = 0,
@NextYearMonth int = 1,
@part2 nvarchar(max) = ''


WHILE @CurrentMonth < 11
BEGIN

SELECT @TableMonth = CASE WHEN (@FirstTableMonth + @CurrentMonth) % 100 < 13 THEN 
@FirstTableMonth + @CurrentMonth 
ELSE
@FirstTableMonth + 100 - (@FirstTableMonth % 100) + @NextYearMonth
END,
@NextYearMonth = CASE WHEN (@FirstTableMonth + @CurrentMonth) % 100 < 13 THEN 
@NextYearMonth
ELSE
@NextYearMonth + 1
END,
@Table_Name = 'xx'+CAST(@TableMonth as varchar)+'_T' ,

@TableMonth2 = @TableMonth+ 1,
@Table_Name2 = 'xx'+CAST(@TableMonth2 as varchar)+'_T' ,
--@TableMonth2 = CAST(@TableMonth2 as varchar),
--print @TableMonth2


@DynamicSQL = @DynamicSQL + 'SELECT *
FROM '+ @Table_Name + ' WHERE co_cde = 15 
and cust_no in (123
) '+ CASE WHEN @CurrentMonth < 10 THEN ' UNION ALL ' ELSE '' END ,


@DynamicSQL2 = @DynamicSQL2 + 'SELECT *
FROM '+ @Table_Name2 + ' where 
cust_no in (123
) ' + CASE WHEN @CurrentMonth < 10 THEN ' UNION ALL ' ELSE '' END ,


@part2 = @part2 + 'SELECT *
FROM OPENQUERY(Server1," SELECT *
FROM xx 
where cust_no in (123
) "

)'



SET @CurrentMonth = @CurrentMonth + 1
IF OBJECT_ID('tempdb..#TEMP') IS NOT NULL BEGIN DROP TABLE #TEMP END
--last months snapshot
SELECT *,
cast(ODATE as datetime) as open_date 
into #temp
FROM OPENQUERY(Server1,' SELECT *
cast(ODATE as datetime) as open_date
FROM xx WHERE cust_no in (123
) '
)
--if equal to month + 99 = previous month then union 11 tables with last months snapshot 
--else 
--union 11 tables with 12th table
SET @OpenQuerySql = 'IF (@FirstTableMonth+99) = CONVERT(nvarchar(6), dateadd(month,-1,GETDATE()), 112)
BEGIN
SELECT *
FROM OPENQUERY(['+ @LinkedServerName +'], '''+ @DynamicSQL + ''' ) 
UNION ALL 
SELECT *
FROM #temp
end
else IF (201404+99) <> CONVERT(nvarchar(6), dateadd(month,-1,GETDATE()), 112)
begin

SELECT *
FROM OPENQUERY(['+ @LinkedServerName +'], '''+ @DynamicSQL + ''' ) 
UNION ALL 
SELECT *
FROM OPENQUERY(['+ @LinkedServerName +'], '''+ @DynamicSQL2 + ''' ) 
end
'
END 
EXEC sp_executesql @OpenQuerySql
GO
 
Share this answer
 
Comments
Miss R 20-Nov-15 4:23am    
what did u alter?
Arasappan 20-Nov-15 4:24am    
IF ITS RUN
Miss R 20-Nov-15 4:25am    
what you mean???
Miss R 20-Nov-15 4:25am    
its taking ages to run
Arasappan 20-Nov-15 4:27am    
Its run or not

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900