データベース容量を変数に取得する方法

このQ&Aのポイント
  • SQL Server 2005 EXPRESSにてストアドを作成し、現在のデータベース容量を変数に取得する方法を教えてください。
  • sp_spaceusedを使用すると、データベースのサイズや割り当てられていないスペースを取得できますが、これをストアド内のローカル変数に代入する方法がわかりません。
  • どうすれば、作成したストアド内でデータベースの容量を取得し、ローカル変数に代入することができるのでしょうか?
回答を見る
  • ベストアンサー

データベース容量を変数に取得したい

SQL Server 2005 EXPRESS にてストアドを作成しています。 自分が作成するストアドの目的は、DB使用率を計算するもので、 その中で現在のDB容量を変数に取得する必要に迫られています。 容量そのものは、「sp_spaceused」を使用する事で databasename | databasesize | unallocated space LogDB | 71.88 MB | 60.41 MB …と、参照出来るのですが、このdatabasesizeの値をどうすれば 自分の作成するストアド内のローカル変数に代入出来るのか判りません。 どうかご教授くださいませ。

質問者が選んだベストアンサー

  • ベストアンサー
  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.1

sp_spaceusedの結果は変数にとることはできません。 2つ以上のセットを返すストアドプロシージャは結果をワークテーブルに受けることができないからです。 代わりにsp_spaceusedが何かやっているかを調べて、それを実装します。 DECLARE @DBSIZE numeric(15,2) SELECT @DBSIZE=CONVERT(decimal(15,2),sum(size))*8192/1048576 from dbo.sysfiles

wendy0303
質問者

お礼

早速の回答ありがとうございます。 今現在 sp_spaceused 内を読んでおりましたが、 十分に理解出来ず苦し紛れなストアドを書いておりました。 >DECLARE @DBSIZE numeric(15,2) >SELECT @DBSIZE=CONVERT(decimal(15,2),sum(size))*8192/1048576 from dbo.sysfiles 教えていただきましたこの文を見てからですと、 sp_spaceused 115行目あたりからの  select database_name = db_name(), database_size = ltrim(str((convert (dec (15,2),@dbsize)… 等、sp_spaceusedが何かやっているかが、理解出来そうな気がしてきました。 素早く、また、理解に繋がる回答、ありがとうございました。

関連するQ&A

  • レコードを削除しても容量が減らない

    毎度お世話になっております。 似た内容の質問を http://okwave.jp/qa5095173.html でしているのですが、求める内容が異なるため別途質問いたします。 質問本文 一度大きくなってしまったDB容量を、 レコード削除後に減らす方法を教えてください。 また、それをストアドで実行する方法があれば教えてください。 以下、状況と経緯になります。 SQL SERVER 2005 EXPRESS で、とあるテーブルに、 EXPRESSの容量限界である4GBまでレコードを詰め込みました。 試験前68.00MBだったデータベースは、試験終了後4088MBとなりました。 試験後、増やしたログテーブルをTruncateし全てのレコードを削除しました。 DBサイズも減るかと思いましたが容量は68.00MBに戻らず4088MBから減りません。 「使用可能領域」が4000MB以上の値を示し 事実DB使用上は何の問題はないのですが、 DBサイズを参照し、DB使用率を表示するレポートを作成しておりまして、「保存レコード件数が少ないのにDBサイズは大きいまま」という状態を何とか回避したいのです。 最適化という方法があると聞き、 http://okwave.jp/qa2283438.html を参照し、真似てみたのですが十分な理解・結果を得られなかったので質問いたします。 どうかよろしくお願いします。

  • 別ファイル(.sql)に記述したクエリの連続実行

    毎度お世話になっております。 現在、SQLServer2005EXPRESS,VisualSudio2008(C#)にて、 十数個の新しいストアドプロシージャと、 それを必要とするアプリを作成しております。 これらを配布先で実装するにはどうするのが最も(使用者にとって)容易か? 知恵をお貸しください。 アプリは実行ファイルをそのまま配布(インストーラー等)すれば 問題無いと考えていますが、ストアドプロシージャは配布先の サーバー管理者がDBに追加しなくてはいけません。 現在、ストアドを作成するためのSQL文を記述した "CREATE_01.sql"~"CREATE_10.sql"を用意していまして、 DB管理者はManagement StudioでDBにログインした状態で これら.sqlファイルを順番にダブルクリック&実行していけば ストアドの作成はできます。 ですが全部で10回も同じ操作をせねばいけません。 できれば「これ押すだけで後は待つだけ」くらいに容易な物にしたいのです。 "CREATE_01.sql"~"CREATE_10.sql"の中身は全てストアドのCREATE文 で、試しに1っの.sql内に実行したい順に CREATE PROCEDURE XXX_01 … AS (中略) CREATE PROCEDURE XXX_02 … AS (中略) CREATE PROCEDURE XXX_03 … AS (中略) …と、いった記述をしますと、使用変数等のエラーが多発し、 また10のSQL中でエラーが出ないように変数を振りなおす&確認する 時間を考えると効率的な方法ではなく思えます。 コマンドの連続実行、というと.batファイルが真っ先に思い浮かぶの ですが、.bat 入門 SQLServer 等のキーワードで検索をしましたが batの用法が幅広いからでしょうか? 現状の私に活用・理解出来るサイト等を見つける事が出来ませんでした。 初歩的な質問をしているかもしれませんが、どうぞよろしくお願いします。

  • 変数に入った値を変数として扱うことはできますか?

    VBスクリプトで自動で作成した値を変数に変化したいのですが、可能なのでしょうか? 例えば hensu = "5" ~DBのテーブルからフィールド名"hensu"を抜き出し、変数"field_set"に入れる。~ OpenField = OpenField & field_set& "=""&"& field_set&"&""" sql = "update test_table set" sql = sql &" "& OpenField sql = sql & "where scode = '" & scode & "'" という感じにしたいのですが、当然"field_set"には"5"ではなく"hensu"というフィールド名の文字列が入ります そもそも変数に入れた値を変数に変換する事って可能なのでしょうか? 宜しくお願い致します。

  • MYSQLでストアドプロシージャの引数を二つ

    MYSQL初心者で参考書にかじりついてプログラミングしています。 主にDBの内容をPHPで吐き出させるといった使い方をしています。 SQL文があまりにも長ったらしくなってきたのでストアドプロシージャを使いたいのですが、使っているSQL文が (SELECT * FROM .変数. WHERE .変数. LIKE '.変数.') UNION (SELECT * FROM .変数. WHERE .変数. LIKE '.変数.'); となっており、引数を複数使えないとスッキリさせられない状況です。 ストアドプロシージャで複数の引数を設定することはできないのでしょうか?

    • ベストアンサー
    • MySQL
  • 長文クエリをアプリから送る方法

    http://okwave.jp/qa5129633.html ↑のスレッドで質問した内容とかぶる部分がありますが (回答下さったjamshid6さん、すいません。) 疑問の主点が変わってきたので別途質問させていただきます。 【目的】 現在、VisualStudio(C#)と、SQLServer2005EXPRESSでアプリ開発をしていまして、 「アプリのワンボタンでストアドが作成できるようにする」 のを要求されています。 ストアド作成の為のCREATE文は「RECOVERY_PROCEDURES.sql」(50kb) というファイルで持っています。(アプリユーザーも) ユーザー(素人を想定)がコマンドプロンプトを叩いたり、 データベースがインストールされているマシンの元まで行き RECOVERY_PROCEDURES.sqlを実行する等の操作は無いものとします。 SQLServer2005はリモート接続の許可済みです。 ストアドを作成するためのSQLを、アプリ側から投げるとしたら 大量の文字列を変数の中に持ってSQL実行を要求する事になります。 そして、普通そんなことはしない…と思います。 データベースとの接続が確立された状態でこの 「RECOVERY_PROCEDURES.sql(CREATE PROCEDURE文)」の内容 を実行するには、アプリをどう作ればいよいのでしょうか? 大量の文字列を入れる変数を用意してやり その中に直接.sqlの文字列を書き込むという方法は試しましたが 改行が入った途端にビルドエラーが多発します。 (C#ではクエリは1行で書かなければいけないようですね) 自分の今までの認識ですと、ストアドを作成するといった操作は DBの管理人(それなりに知識がある)人間が行う操作で アプリのソースにストアドの内容を全部記述して誰でも作成できるようにするという要求に戸惑っています。 長々と書いてしまいましたが、アプリユーザーがワンボタンで 「RECOVERY_PROCEDURES.sql」の内容のストアドが作成出来れば 手段は選びません。どうかご教授くださいませ。

  • SQLServer2005ストアドのソース取得

    こんにちは。 VB.NET Framework 2.0で開発しています。 SQLServer2005(DB)で管理しているストアドのソースを取得するプログラムを作成 しようと考えているのですが、ローカルPCからリモートDB上で管理しているソース の取得方法が解らず困っております。ご教授お願い致します。

  • SQLiteのデータベースについて

    PHP初心者です。以下のSQLiteより作成するデータベースについて教えてください。 $DB = sqlite_open('db1.db'); $sql="create table tables(id integer ,name,texts)"; $result=sqlite_query($db,$SQL); 上記、プログラムにより、同ディレクトリに、db1.dbが作成されますが、このデータベース情報はどのようにして、閲覧するのでしょうか(MS-ACCESS、SQLのように簡単に閲覧できないのか)。主キーやテーブルの名前またはフィールドの名前の変更、データ一覧閲覧などどのようにするのでしょうか。 環境は、Windows環境で、PHP4を使用しております。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • Oracleでデータ取得処理を高速化するには?

    DBサーバー(Oracle10g)でCPU使用率が100%近くとなり、システムを調べたところ、どのSQL文が遅いかを特定する事はできました。 SQL文の見直しはするとして、それでも改善できない場合、高速化にはどのような手立てをするものなのでしょうか? 自分の考えでは↓を考えています。 ・SQL見直し ・VIEWを使う あらかじめ特定のテーブルを結合しておけば速くなる?と思っています ・ストアドプロシージャーにする すいませんがよろしくお願いします。

  • 他のDBのオブジェクトの利用

    同一スキーマ上の別のDBのテーブルを使ってビューを作成したり ストアドを作成したりする事は可能でしょうか? また、アクセスから接続しているDB以外のDBのテーブルに フォームやVBAからアクセスする事は可能でしょうか? (要は、アクセスのMDBのリンクテーブルの接続先が複数ある様な イメージです) やりたい事はアクセスの請求書発行システムのFORMから 取引先管理システムの取引先テーブルを参照したり、SQLの 請求書発行DBのビューやストアドで取引先管理DBのテーブルを 参照しいたいのです。

  • SQL Server2008のスカラー変数

    AccessからSQL Server2008に接続しています。 MSDE2000で、ストアドプロシージャを作成するときは @ST INT = 1 AS SELECT ....... で実行できましたが、2008はエラー となります。 DECLARE @ST int = 1 SELECT ...... とすると、変数@STは宣言済みとエラーになりますが、なぜでしょうか? ご存じの方がおられましたら、よろしくお願いします。