usar - variables @@ sql server
Nombre de la tabla como variable (7)
Estoy tratando de ejecutar esta consulta:
declare @tablename varchar(50)
set @tablename = ''test''
select * from @tablename
Esto produce el siguiente error:
Msg 1087, nivel 16, estado 1, línea 5
Debe declarar la variable de la tabla "@tablename".
¿Cuál es la forma correcta de tener el nombre de la tabla poblado dinámicamente?
Cambia tu última declaración a esto:
EXEC(''SELECT * FROM '' + @tablename)
Así es como hago el mío 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'''''')
Los nombres de tabla y columna deben ser estáticos, si la consulta es estática. Para nombres dinámicos de tablas o columnas, debe generar el SQL completo de forma dinámica y usar sp_executesql para ejecutarlo.
Más detalles aquí: La maldición y bendiciones de SQL dinámico
No puede usar un nombre de tabla para una variable, sino que debe hacer esto:
DECLARE @sqlCommand varchar(1000)
SET @sqlCommand = ''SELECT * from yourtable''
EXEC (@sqlCommand)
Tendrá que generar el sql de forma dinámica:
declare @tablename varchar(50)
set @tablename = ''test''
declare @sql varchar(500)
set @sql = ''select * from '' + @tablename
exec (@sql)
Un poco tarde para una respuesta pero debería ayudar a alguien más:
CREATE PROCEDURE [dbo].[GetByName]
@TableName NVARCHAR(100)
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
DECLARE @sSQL nvarchar(500);
SELECT @sSQL = N''SELECT * FROM'' + QUOTENAME(@TableName);
EXEC sp_executesql @sSQL
END
Utilice sp_executesql
para ejecutar cualquier SQL, por ejemplo
DECLARE @tbl sysname,
@sql nvarchar(4000),
@params nvarchar(4000),
@count int
DECLARE tblcur CURSOR STATIC LOCAL FOR
SELECT object_name(id) FROM syscolumns WHERE name = ''LastUpdated''
ORDER BY 1
OPEN tblcur
WHILE 1 = 1
BEGIN
FETCH tblcur INTO @tbl
IF @@fetch_status <> 0
BREAK
SELECT @sql =
N'' SELECT @cnt = COUNT(*) FROM dbo.'' + quotename(@tbl) +
N'' WHERE LastUpdated BETWEEN @fromdate AND '' +
N'' coalesce(@todate, ''''99991231'''')''
SELECT @params = N''@fromdate datetime, '' +
N''@todate datetime = NULL, '' +
N''@cnt int OUTPUT''
EXEC sp_executesql @sql, @params, ''20060101'', @cnt = @count OUTPUT
PRINT @tbl + '': '' + convert(varchar(10), @count) + '' modified rows.''
END
DEALLOCATE tblcur
Declare @fs_e int, @C_Tables CURSOR, @Table varchar(50)
SET @C_Tables = CURSOR FOR
select name from sysobjects where OBJECTPROPERTY(id, N''IsUserTable'') = 1 AND name like ''TR_%''
OPEN @C_Tables
FETCH @C_Tables INTO @Table
SELECT @fs_e = sdec.fetch_Status FROM sys.dm_exec_cursors(0) as sdec where sdec.name = ''@C_Tables''
WHILE ( @fs_e <> -1)
BEGIN
exec(''Select * from ''+ @Table)
FETCH @C_Tables INTO @Table
SELECT @fs_e = sdec.fetch_Status FROM sys.dm_exec_cursors(0) as sdec where sdec.name = ''@C_Tables''
END