2010-05-15 15 views
106

Estoy tratando de ejecutar esta consulta:nombre de la tabla como variable de

declare @tablename varchar(50) 
set @tablename = 'test' 
select * from @tablename 

Esto produce el siguiente error:

Msg 1087, Level 16, State 1, Line 5

Must declare the table variable "@tablename".

¿Cuál es la forma correcta de haber poblado nombre de la tabla dinámica?

Respuesta

91

Los nombres de tabla y nombres de 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í: The curse and blessings of dynamic SQL

31

No puede utilizar un nombre de tabla para una variable, que tendría que hacer esto en su lugar:

DECLARE @sqlCommand varchar(1000) 
SET @sqlCommand = 'SELECT * from yourtable' 
EXEC (@sqlCommand) 
9

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) 
59

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''') 
26

poco tarde para una respuesta, pero debe ayudar a otra persona:

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 
+6

QUOTENAME es importante para la seguridad. Gracias. –

+0

¿Pero cómo devolver el valor de dicha consulta? P.ej. 'COUNT (*)'? – Suncatcher

-1
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 
1
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 

He puesto las líneas que p

+0

Esta publicación debe ser editada, y puede necesitar alguna explicación .. –

Cuestiones relacionadas