1

私はinterbaseとfirebirdにSQLマネージャーを使用しています.SQLスクリプトのすべてのテーブルの行を数えたい約130のテーブルがあります。なぜ私はインターベース用のSQLマネージャーを選択しており、firebirdはGDB形式のバックアップファイルです.私はすでにGDBファイルを復元しています.行を数える必要があります. このクエリを試しましたが、機能しません

USE DatabaseName
GO
CREATE TABLE #temp (
table_name sysname ,
row_count INT,
reserved_size VARCHAR(50), 
data_size VARCHAR(50),
index_size VARCHAR(50),
unused_size VARCHAR(50))
SET NOCOUNT ON
INSERT #temp
EXEC sp_msforeachtable 'sp_spaceused ''?'''
SELECT a.table_name,
a.row_count,
COUNT(*) AS col_count,
a.data_size
FROM #temp a
INNER JOIN information_schema.columns b
ON a.table_name collate database_default
= b.table_name collate database_default
GROUP BY a.table_name, a.row_count, a.data_size
ORDER BY CAST(REPLACE(a.data_size, ' KB', '') AS integer) DESC
DROP TABLE #temp

エラー-104が発生します。

4

3 に答える 3

3

データベース内のすべてのテーブルのレコード数を取得するには、Firebird FAQ 項目「すべてのテーブルのレコード数を取得する方法」からこのスクリプトを使用できます。. 完全を期すために、以下のスクリプトをコピーしました。

set term !! ;
EXECUTE BLOCK
returns ( stm varchar(60), cnt integer )
as
BEGIN
   for select cast('select count(*) from "'||trim(r.RDB$RELATION_NAME)||'"' as varchar(60)) 
       from RDB$RELATIONS r
       where (r.RDB$SYSTEM_FLAG is null or r.RDB$SYSTEM_FLAG = 0) 
       and r.RDB$VIEW_BLR is null
       order by 1
   into :stm
   DO
   BEGIN
      execute statement :stm into :cnt;
      suspend;
   END
END

これは、現在のトランザクションに表示されるレコードのみをカウントすることに注意してください。このスクリプトは Firebird で動作します (Firebird 2.5 でテストしました) が、Firebird と Interbase の方言は過去 13 年間で少し異なるため、おそらく Interbase では動作しません。

于 2013-07-22T18:02:36.923 に答える
2

「SQLマネージャー」の意味がわかりませんが(おそらくMS SQL Serverツールですか?)、投稿したSQLはFirebirdと互換性がありません。

Firebird にはgstat、データベースを分析するための特別な (コマンド ライン) ツールがあります。マニュアルはオンラインで入手できます。ただし、AFAIKが報告するレコード数に最も近いのは、PKインデックスのノード数です。

システムテーブルからテーブル名を読み取り、それぞれカウントを照会するストアドプロシージャを作成することは可能ですが、それを行う価値があるかどうかは、レコードカウントが必要な理由によって異なります。

于 2013-07-22T13:06:54.973 に答える