表名作为变量

时间:2010-05-15 01:07:17

标签: sql sql-server tsql variable-names tablename

我正在尝试执行此查询:

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

这会产生以下错误:

  

Msg 1087,Level 16,State 1,Line 5

     

必须声明表变量“@tablename”。

动态填充表名的正确方法是什么?

10 个答案:

答案 0 :(得分:107)

如果查询是静态的,则表名和列名必须是静态的。对于动态表或列名,您应该动态生成完整的SQL,并使用sp_executesql来执行它。

此处有更多详情:The curse and blessings of dynamic SQL

答案 1 :(得分:81)

将您的上一个陈述更改为:

EXEC('SELECT * FROM ' + @tablename)

这就是我在存储过程中的做法。第一个块将声明变量,并根据当前年份和月份名称设置表名称,在本例中为TEST_2012OCTOBER。然后我检查它是否已存在于DB中,如果存在则删除。然后下一个块将使用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''')

答案 2 :(得分:35)

您不能为变量使用表名,而是必须这样做:

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

答案 3 :(得分:31)

回答迟到但应该帮助其他人:

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

答案 4 :(得分:12)

你需要动态生成sql:

declare @tablename varchar(50) 

set @tablename = 'test' 

declare @sql varchar(500)

set @sql = 'select * from ' + @tablename 

exec (@sql)

答案 5 :(得分:5)

使用strip执行任何SQL,例如

sp_executesql

答案 6 :(得分:1)

Declare  @tablename varchar(50) 
set @tablename = 'Your table Name' 
EXEC('select * from ' + @tablename)

答案 7 :(得分:1)

您需要使用SQL Server动态SQL

DECLARE @table     NVARCHAR(128),
        @sql       NVARCHAR(MAX);

SET @table = N'tableName';

SET @sql = N'SELECT * FROM ' + @table;

使用 EXEC 执行任何SQL

EXEC (@sql)

使用 EXEC sp_executesql 执行任何SQL

EXEC sp_executesql @sql;

使用 EXECUTE sp_executesql 执行任何SQL

EXECUTE sp_executesql @sql

答案 8 :(得分:0)

此外,您可以使用此...

<report
    id="report_sale_order_landscape_id"
    model="sale.order"
    string="Sale Order Landscape"
    report_type="qweb-pdf"
    name="sale.report_sale_order_landscape"
    file="sale.report_sale_order_landscape"
    paperformat="test_module.report_sale_order_landscape"
/>

答案 9 :(得分:-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