2

複数のベースに存在する (または存在しない) 特定のテーブルの行数を知る必要があります。

これが私が持ってきたものです:

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

テーブル名は静的でなければならないことを知っているので、選択ステートメントを動的に作成しています。結果は次のようになります。

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

そしてそれは続く。

データベースにテーブルが存在しない場合、または管理スタジオでこのスクリプトを実行しているユーザーが特定のデータベースにアクセスできない場合、エラーがスローされます。

これを行うより良い方法はありますか?

4

1 に答える 1

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';
于 2013-09-13T12:45:10.897 に答える