当前位置: 首页 > 面试题库 >

表名作为变量

龚弘业
2023-03-14
问题内容

我正在尝试执行此查询:

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

这将产生以下错误:

Msg 1087,第16级,状态1,第5行

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

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


问题答案:

对于静态查询(如您的问题中的查询),表名和列名必须是静态的。

对于动态查询,应动态生成完整的SQL,并使用sp_executesql执行它。

这是一个脚本示例,用于比较不同数据库的相同表之间的数据:

静态查询:

SELECT * FROM [DB_ONE].[dbo].[ACTY]
EXCEPT
SELECT * FROM [DB_TWO].[dbo].[ACTY]

由于我想轻松更改tableand的名称schema,因此创建了以下动态查询:

declare @schema varchar(50)
declare @table varchar(50)
declare @query nvarchar(500)

set @schema = 'dbo'
set @table = 'ACTY'

set @query = 'SELECT * FROM [DB_ONE].[' + @schema + '].[' + @table + '] EXCEPT SELECT * FROM [DB_TWO].[' + @schema + '].[' + @table + ']'

EXEC sp_executesql @query

由于动态查询具有许多需要考虑的细节并且难以维护,因此我建议您阅读:动态SQL的诅咒和祝福



 类似资料:
  • 问题内容: 我在python中有此代码。 我将从这样的命令行运行此脚本 因此,我需要一种使len使用列表而不是变量的方法,我只想在var中给出列表的名称。 我知道在这个例子中我可以做 但是我的脚本上有13个列表,我需要一种方法,可以通过在命令行上输入的名称来引用它们。 问题答案: 尽管这在Python中是完全可能的,但不是必需的。最好的解决方案是不执行此操作,而是使用字典。 您会注意到脚本中有13

  • 问题内容: 我正在尝试将表名传递到我的mysql存储过程中,以使用此sproc从其他表中进行选择,但是它不起作用… 这是我正在尝试的: 我也尝试过不带@符号,它只是告诉我TableName不存在…我知道:) 问题答案: 它取决于DBMS,但是这种表示法通常需要Dynamic SQL,并且会遇到一个问题,即函数执行时的返回值取决于输入。这给系统带来了麻烦。作为一般规则(因此可能会有例外),DBMS不

  • 问题内容: 意思是我想根据from的值动态离开联接表,因为从那里取了。 但是上面的查询结果 表table_name不存在 我的mysql限制错误? 问题答案: 表名和列名在SQL查询中不能是动态的。因此,您必须使用2个查询或存储过程以编程方式应用逻辑,请参见此处的示例:http : //forums.mysql.com/read.php?98,126506,126598#msg-126598

  • 问题内容: 我正在尝试编写一个简单的存储过程,该过程需要三个参数“数据库名称一”,“数据库名称二”和“表名称”。然后,sql将对每个数据库中定义的表执行行计数并将其存储。 零星地处理它,我遇到了第一个问题,即您做不到 我知道您可以在命令中使用动态sql,但这并不理想,因为我无法返回值。 下面的示例看起来像它应该工作,但是不起作用。 给出的错误信息是 当前正在使用SQL Server 2008 SP

  • 问题内容: 我有一个分配了字符串的变量,我想根据该字符串定义一个新变量。 问题答案: 你可以使用exec:

  • 问题内容: 我想使用变量的值来访问对象。 假设我有一个名为myobject的对象。 我想用此名称填充变量,然后使用该变量访问对象。 例: 问题答案: 全球: 全球:v2 本地:v1 本地:v2