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

从将名称作为变量传递的表中选择

柴彬
2023-03-14
问题内容

我正在尝试编写一个简单的存储过程,该过程需要三个参数“数据库名称一”,“数据库名称二”和“表名称”。然后,sql将对每个数据库中定义的表执行行计数并将其存储。

零星地处理它,我遇到了第一个问题,即您做不到

select * from @tablename

我知道您可以在exec命令中使用动态sql,但这并不理想,因为我无法返回值。

下面的示例看起来像它应该工作,但是不起作用。

declare @tablename as nvarchar(500)
declare @sqlstring as nvarchar(500)
declare @parmdefinition as nvarchar(500)
declare @numrows as bigint

set @tablename = N'dummy_customer'

set @parmdefinition = N'@tablenameIN nvarchar(500), @numrowsOUT as bigint OUTPUT'

select @sqlstring = 'select @numrowsOUT = count(*) from @tablenameIN'

select @sqlstring

exec sp_executesql @sqlstring, @parmdefinition, @tablenameIN = @tablename, @numrowsOUT = @numrows OUTPUT

select @numrows

给出的错误信息是

Msg 1087, Level 16, State 1, Line 1
Must declare the table variable "@tablenameIN".

当前正在使用SQL Server 2008 SP2。

编辑:之所以这样做是因为我们正在进行迁移,并且客户想要一个报告,该报告显示源数据库和目标数据库中每个表的行数。由于有许多表能够使用sp_MSForEachTable来调用存储的proc,因此似乎是理想的选择。

编辑:

最终的解决方案,以供将来参考

declare @tablename as nvarchar(500)
declare @sqlstring as nvarchar(500)
declare @parmdefinition as nvarchar(500)
declare @numrows as bigint

set @tablename = N'dummy_customers'

set @parmdefinition = N'@tablename nvarchar(500), @numrowsOUT as bigint OUTPUT'

select @sqlstring = 'select @numrowsOUT = count(*) from ' + quotename(@tablename)

exec sp_executesql @sqlstring, @parmdefinition, @tablename = @tablename, @numrowsOUT = @numrows OUTPUT

select @numrows

问题答案:

您必须使用动态sql,并将表名连接到SQL字符串中,然后才能通过sp_executsql执行:

select @sqlstring = 'select @numrowsOUT = count(*) from ' + QUOTENAME(@tablename)
EXECUTE sp_executesql ....


 类似资料:
  • 问题内容: 我有一种情况,从中获取表名应该是从一个设置变量: 但是这样做会导致MySQL输出错误,所以有人可以向我展示如何实现这一点,因为这是我在MySQL中的基本步骤。 问题答案: 您必须使用准备好的语句来执行此操作。就像是:

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

  • 问题内容: 我正在尝试执行此查询: 这将产生以下错误: Msg 1087,第16级,状态1,第5行 必须声明表变量“ @tablename”。 动态填充表名的正确方法是什么? 问题答案: 对于静态查询(如您的问题中的查询),表名和列名必须是静态的。 对于动态查询,应动态生成完整的SQL,并使用sp_executesql执行它。 这是一个脚本示例,用于比较不同数据库的相同表之间的数据: 静态查询:

  • 从java中字符串的值创建对现有对象的引用 在我的项目中,有很多按钮(目前大约70个);每个按钮都会在数据库的jlabel中提出一个问题。现在,根据用户的选择,每个按钮(swings的jButton)将被分配颜色,这取决于用户是否想查看问题,或者他是否标记了问题的答案。 一种方法是为每个jbutton的actionperformed编码,并在每个jbutton中使用if-else来获得确切的颜色,

  • 问题内容: 如果我有 我如何在内部找出现在由表示的变量称为? 问题答案: 这是不可能的。即使是按引用传递也不会帮助您。您必须将名称作为第二个参数传递。 但是,您肯定要问的 不是 解决问题的好方法。

  • 我是PYSPARK/SPARKSQL的初学者,我有一个如下的要求,我有一个如下的配置表(DataFrame:Config),Config:< br > | data frame | col 1 | col 2 | col 3 |:-|:-:|-:|-:|-:| Emp | name 1 | name 2 | Address | Job | Doj | Role | DOB 我已经迭代了上面的数据帧