2010-11-09 70 views
0

我正在尝试编写一个简单的存储过程,它包含三个参数“数据库名称一”,“数据库名称二”和“表名称”。然后,sql将为每个数据库中定义的表执行一次行计数并存储它。从名称作为变量传递的表中选择

它的工作零碎我已经打了第一个问题,你不能这样做

select * from @tablename 

我知道你可以使用动态SQL与exec命令,但因为我无法回报,这是不理想值。

下面的示例看起来应该可以工作,但不能。

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来调用存储过程似乎是理想的。

编辑:

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

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 

回答

6

你不得不使用动态SQL,并连接所有的表名到SQL字符串,然后通过sp_executsql执行:

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

完美的作品。谢谢。 – JamieDainton 2010-11-09 22:07:43