我正在尝试执行此查询:
declare @tablename varchar(50)
set @tablename = 'test'
select * from @tablename
这会产生以下错误:
Msg 1087,Level 16,State 1,Line 5
必须声明表变量“@tablename”。
动态填充表名的正确方法是什么?
答案 0 :(得分:107)
如果查询是静态的,则表名和列名必须是静态的。对于动态表或列名,您应该动态生成完整的SQL,并使用sp_executesql来执行它。
答案 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