从多个数据库中的某个表中获取行数

时间:2013-09-13 11:58:38

标签: sql sql-server-2008 sql-server-2008-r2

我需要知道在多个基础中存在(或不存在)的某个表的行数。

这就是我的意思:

DECLARE @NomeBase as char(60)
declare @base as char(100)
declare @select as char(1000)

DECLARE CBases CURSOR FOR  select databasename from sig_orgao_web
 --gets all my databases
OPEN CBases
FETCH NEXT FROM CBases INTO  @NomeBase 

WHILE (@@FETCH_STATUS = 0)
  BEGIN           
    set @base =rtrim(@NomeBase) + '.dbo.sia_pais' -- database.dbo.table format
    select @base
    set @select = 'SELECT cast(  count(*) as char(70)) from ' + @base 
    exec (@select)

    FETCH NEXT FROM CBases INTO  @NomeBase
  END
CLOSE CBases
DEALLOCATE CBases

我知道表名必须是静态的,所以我正在创建select语句。 结果是这样的:

SIIG_DAT_DESENV.dbo.sia_pais    
13
SIIG_DAT_HOMOLOGACAO.dbo.sia_pais
13

它继续。

问题是,如果我的数据库中不存在该表,或者如果在管理工作室上运行此脚本的用户无法访问某个数据库,则会引发错误。

有更好的方法吗?

1 个答案:

答案 0 :(得分:2)

检查每次迭代中是否存在对象:

set @select = 'IF Object_ID(''' + @base + ''') IS NOT NULL BEGIN SELECT cast(  count(*) as char(70)) from ' + @base + ' END'

如果您想查看每个数据库,那么您应该尝试这个漂亮的单行程序:

EXEC sp_msForEachDB 'IF Object_ID(''[?].dbo.sia_pais'') IS NOT NULL BEGIN SELECT Count(*) FROM [?].dbo.sia_pais END';