SQL 错误 - 必须声明表变量“@tablename”

Posted

技术标签:

【中文标题】SQL 错误 - 必须声明表变量“@tablename”【英文标题】:SQL error - Must declare the table variable "@tablename" 【发布时间】:2020-03-05 09:02:20 【问题描述】:

如何在函数内部创建变量并从表中选择数据? 当我尝试创建此函数时,我收到错误:

必须声明表变量“@tablename”

这是我的功能:

create function FunctionName (@val1 INT , @val2 INT)

RETURNS @result TABLE
(
Name1 nvarchar(100) not null,
Name2 nvarchar(100) not null,
Name3 nvarchar(100) not null,
Name4 nvarchar(100) not null,
)

AS
BEGIN
    DECLARE @tablename nvarchar(max)
    SET @tablename = CONCAT('Export_Pivot_',@val1,'_',@val2)    
    INSERT into @result
SELECT 
name1,name2,name3,name4
FROM  @tablename

RETURN
END

【问题讨论】:

不能有DECLARE @tablename nvarchar(max) = CONCAT('Export_Pivot_',@val1,'_',@val2)吗? 还是报错 必须声明表变量“@tablename”。 当我输入表格名称时它正在工作,但是当我想动态获取名称时它不工作 不能使用参数而不是表名。没有办法解决这个问题。 SQL 中的表类似于强类型语言中的类型。查询会根据表架构、索引、从表到表甚至随时间变化的统计信息编译为执行计划。 将你的sql查询改为动态sql查询什么是动态查询:essentialsql.com/build-dynamic-sql-stored-procedure 【参考方案1】:

语句中的表名不能是变量 - 您必须创建一些动态 SQL 作为字符串,然后执行它。 您还需要将您的选择填充到@result 表中。

您的表声明中的逗号也过多。

试试这个:

create function FunctionName (@val1 int , @val2 int)
    RETURNS @result TABLE
    (
    Name1 nvarchar(100),
    Name2 nvarchar(100),
    Name3 nvarchar(100),
    Name4 nvarchar(100)
    )
    AS
    BEGIN
        exec('SELECT name1,name2,name3,name4 FROM ' + 'Export_Pivot_'+@val1+'_'+@val2 + ' into @result');
    RETURN
    END
    go

【讨论】:

需要使用存储过程,因为无法在函数中执行动态 SQL。考虑在作为答案发布之前测试您的代码。

以上是关于SQL 错误 - 必须声明表变量“@tablename”的主要内容,如果未能解决你的问题,请参考以下文章

尝试在 SQL 中运行 UPDATE 语句时“必须声明标量变量”

SQL 提示必须声明表变量

从 SQL 函数返回动态透视表的困难 - “必须声明表变量 xxx”

表变量和错误“必须声明标量变量”

sql数据库错误“必须声明标量变量”

sql必须声明标量变量错误