Jam*_*ton 0 sql t-sql sql-server-2008
我正在尝试编写一个简单的存储过程,它接受三个参数'数据库名称一个','数据库名称二'和'表名称'.然后,sql将为每个数据库中的已定义表执行行计数并存储它.
零碎的工作我遇到了第一个你不能做的问题
select * from @tablename
Run Code Online (Sandbox Code Playgroud)
我知道你可以在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
Run Code Online (Sandbox Code Playgroud)
给出的错误信息是
Msg 1087, Level 16, State 1, Line 1
Must declare the table variable "@tablenameIN".
Run Code Online (Sandbox Code Playgroud)
目前使用的是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
Run Code Online (Sandbox Code Playgroud)
您必须使用动态sql,并将表名连接到SQL字符串,然后通过sp_executsql执行:
select @sqlstring = 'select @numrowsOUT = count(*) from ' + QUOTENAME(@tablename)
EXECUTE sp_executesql ....
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2209 次 |
| 最近记录: |