我正在尝试执行这个查询:
declare @tablename varchar(50)
set @tablename = 'test'
select * from @tablename
这会产生以下错误:
编号1087,16层,状态1,5线 必须声明表变量“@tablename”。
动态填充表名的正确方法是什么?
我正在尝试执行这个查询:
declare @tablename varchar(50)
set @tablename = 'test'
select * from @tablename
这会产生以下错误:
编号1087,16层,状态1,5线 必须声明表变量“@tablename”。
动态填充表名的正确方法是什么?
当前回答
变量不能使用表名。你必须这样做:
DECLARE @sqlCommand varchar(1000)
SET @sqlCommand = 'SELECT * from yourtable'
EXEC (@sqlCommand)
其他回答
变量不能使用表名。你必须这样做:
DECLARE @sqlCommand varchar(1000)
SET @sqlCommand = 'SELECT * from yourtable'
EXEC (@sqlCommand)
对于静态查询,比如您问题中的查询,表名和列名需要是静态的。
对于动态查询,您应该动态生成完整的SQL,并使用sp_executesql来执行它。
下面是一个脚本示例,用于比较不同数据库的相同表之间的数据:
静态查询:
SELECT * FROM [DB_ONE].[dbo].[ACTY]
EXCEPT
SELECT * FROM [DB_TWO].[dbo].[ACTY]
因为我想轻松地更改表和模式的名称,所以我创建了这个动态查询:
declare @schema sysname;
declare @table sysname;
declare @query nvarchar(max);
set @schema = 'dbo'
set @table = 'ACTY'
set @query = '
SELECT * FROM [DB_ONE].' + QUOTENAME(@schema) + '.' + QUOTENAME(@table) + '
EXCEPT
SELECT * FROM [DB_TWO].' + QUOTENAME(@schema) + '.' + QUOTENAME(@table);
EXEC sp_executesql @query
由于动态查询有许多需要考虑的细节,而且它们很难维护,我建议您阅读:动态SQL的诅咒和祝福
你需要动态生成SQL内容:
declare @tablename varchar(50)
set @tablename = 'test'
declare @sql varchar(500)
set @sql = 'select * from ' + @tablename
exec (@sql)
Declare @tablename varchar(50)
set @tablename = 'Your table Name'
EXEC('select * from ' + @tablename)
把你的最后一句话改成这样:
EXEC('SELECT * FROM ' + @tablename)
这就是我在存储过程中如何执行的。第一个块将声明变量,并根据当前的年月名设置表名,在本例中为TEST_2012OCTOBER。然后检查它是否已经存在于数据库中,如果存在则删除它。然后,下一个块将使用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''')