为了账号安全,请及时绑定邮箱和手机立即绑定

表名为变量

表名为变量

慕后森 2019-06-14 10:36:30
表名为变量我正在尝试执行以下查询:declare @tablename varchar(50)set @tablename = 'test'select * from @tablename这会产生以下错误:MSG 1087,16级,状态1,第5行必须声明表变量“@tablename”。动态填充表名的正确方法是什么?
查看完整描述

3 回答

?
喵喵时光机

TA贡献1846条经验 获得超7个赞

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

这里有更多细节:动态SQL的诅咒与祝福


查看完整回答
反对 回复 2019-06-14
?
红颜莎娜

TA贡献1842条经验 获得超12个赞

将最后一条语句更改为:

EXEC('SELECT * FROM ' + @tablename)

这就是我在存储过程中所做的工作。第一个块将声明变量,并根据当前年份和月份名称设置表名,在本例中是test_2012OCTOBER。然后,我检查它是否已经存在于DB中,如果已经存在,则删除它。然后,下一个块将使用SELECT INTO语句来创建该表,并使用来自另一个表的带有参数的记录填充它。

--DECLARE TABLE NAME VARIABLE DYNAMICALLYDECLARE @table_name varchar(max)SET @table_name = 
    (SELECT 'TEST_'
            + DATENAME(YEAR,GETDATE())
            + UPPER(DATENAME(MONTH,GETDATE())) )--DROP THE TABLE IF IT ALREADY EXISTSIF 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 TABLEEXEC('SELECT * INTO '
     + @table_name + ' FROM dbo.MASTER WHERE STATUS_CD = ''A''')


查看完整回答
反对 回复 2019-06-14
?
胡子哥哥

TA贡献1825条经验 获得超6个赞

不能为变量使用表名,只能这样做:

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


查看完整回答
反对 回复 2019-06-14
  • 3 回答
  • 0 关注
  • 705 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信