Измените свое последнее утверждение на это:
EXEC('SELECT * FROM ' + @tablename)
Так я поступаю в хранимой процедуре. Первый блок объявляет переменную и устанавливает имя таблицы на основе текущего года и названия месяца, в данном случае TEST_2012OCTOBER. Затем я проверяю, существует ли он уже в БД, и удаляю, если он есть. Затем следующий блок будет использовать инструкцию SELECT INTO для создания таблицы и заполнения ее записями из другой таблицы с параметрами.
--DECLARE TABLE NAME VARIABLE DYNAMICALLY
DECLARE @table_name varchar(max)
SET @table_name =
(SELECT 'TEST_'
+ DATENAME(YEAR,GETDATE())
+ UPPER(DATENAME(MONTH,GETDATE())) )
--DROP THE TABLE IF IT ALREADY EXISTS
IF EXISTS(SELECT name
FROM sysobjects
WHERE name = @table_name AND xtype = 'U')
BEGIN
EXEC('drop table ' + @table_name)
END
--CREATES TABLE FROM DYNAMIC VARIABLE AND INSERTS ROWS FROM ANOTHER TABLE
EXEC('SELECT * INTO ' + @table_name + ' FROM dbo.MASTER WHERE STATUS_CD = ''A''')