variable usar tipos tabla stored nombre como sql sql-server tsql variable-names tablename

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