SQL Server カーソルでテーブルサイズを一覧
カーソルのサンプルスクリプトを紹介します。
カーソルを利用する際に雛形として使えると思います。
このサンプルスクリプトは、全てのユーザーテーブルのサイズを表示します。
カーソルを含むストアドプロシージャの名前を sp_usertablesize とします。
sp_usertablesize の中では、
1) ユーザーテーブルの名前の一覧を取得し、
2) 各ユーザーテーブルのサイズを sp_spaceused を実行して取得します。
3) sp_spaceused を実行して得られたデータは、usertablesize テーブルに保存し、
3) 最後に usertablesize テーブルを select します。
あらかじめ、usertablesize テーブルを作成しておきます。
このテーブルには、sp_spaceused を実行して得られたデータを一時的に保存します。
ストアドプロシージャの中で一時テーブルとして作成しても構いません。
ここでは、わかり易くするために、パーマネントテーブルを作成します。
create table dbo.usertablesize (
name varchar(100),
rows int,
reserved varchar(100),
data varchar(100),
index_size varchar(100),
unused varchar(100),
execdate datetime default getdate())
sp_usertablesize を作成します。
カーソルに関する解説を入れておきます。
CREATE PROCEDURE dbo.sp_usertablesize
as
declare @currow int -- 変数の宣言:カーソル内のデータ数を保管します。
declare @tablename varchar(50) -- 変数の宣言:テーブル名を保管します。
delete from usertablesize
declare cur_tablelist cursor scroll -- カーソルを宣言します。
for select name from .sysobjects where xtype='U' and order by name
for read only
open cur_tablelist -- カーソルをオープンします。
set @currow = (select @@CURSOR_ROWS) -- @currow 変数にカーソル内のデータ数を入れます。
-- @@CURSOR_ROWS はカーソル内のデータ数を返します。
-- 次の While~End をデータ数と同じ回数繰り返すために使います。
While @currow > 0 begin -- @currow 変数の値が0になるまで繰り返し実行します。
fetch next from cur_tablelist into @tablename -- カーソル内のデータを取得し、@tablename 変数に保管します。
insert into tablesize(name, rows, reserved, data, index_size, unused) exec sp_spaceused @tablename
set @currow = (@currow-1) -- @currow 変数の値を1減らします。
End
close cur_tablelist -- カーソルを閉じます。
deallocate cur_tablelist -- カーソルの宣言を開放します。
select * from usertablesize
GO
ちなみに、SQL Serverでは、カーソルをネストすることができますが、Oracleではできなかったと思います。確か。