Cambiar la última declaración a este:
EXEC('SELECT * FROM ' + @tablename)
Ésta es la forma en que hago la mía en un procedimiento almacenado. El primer bloque declarará la variable y establecerá el nombre de la tabla según el año y el nombre del mes actual, en este caso TEST_2012OCTOBER. Luego compruebo si ya existe en el DB y lo elimino si lo hace. Luego, el próximo bloque usará una instrucción SELECT INTO para crear la tabla y llenarla con registros de otra tabla con parámetros.
--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''')
QUOTENAME es importante para la seguridad. Gracias. –
¿Pero cómo devolver el valor de dicha consulta? P.ej. 'COUNT (*)'? – Suncatcher