1

我正在为interbase 和 firebird使用 sql manager ,我有大约130 个表我想计算 sql 脚本中所有表的行数。为什么我为 interbase 和 firebird 选择 sql manager 是我在 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 常见问题解答项目“如何获取所有表的记录数?”中的此脚本。. 为了完整起见,我复制了下面的脚本:

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 对其进行了测试),但可能不适用于 Interbase,因为 Firebird 和 Interbase 方言在过去 13 年中出现了一些分歧。

于 2013-07-22T18:02:36.923 回答
2

不确定您对“sql manager”(可能是一些 MS SQL Server 工具?)的意思,但您发布的 SQL 与 Firebird 不兼容,是的。

Firebird 有专门的gstat(命令行)工具来分析数据库。该手册可在线获取。但是,AFAIK 最接近它报告的记录计数是 PK 索引中的节点计数。

可以创建存储过程,从系统表中读取表名并查询每个表的计数,但是否值得这样做取决于您为什么需要记录计数。

于 2013-07-22T13:06:54.973 回答
0

试试这个(有修复) -

SELECT 
      o.[object_id]
    , [object_name] = s.name + '.' + o.name
     , c.col_count
     , r.row_count
     , data_size  = CAST(r.pages * 8 AS VARCHAR(10)) + ' KB'
FROM sys.objects o WITH (NOWAIT)
JOIN sys.schemas s WITH (NOWAIT) ON o.[schema_id] = s.[schema_id]
JOIN (
     SELECT c.[object_id], col_count = COUNT(1)
     FROM sys.columns c WITH (NOWAIT)
     GROUP BY c.[object_id]
) c ON c.[object_id] = o.[object_id]
JOIN (
     SELECT
          p.[object_id]
          , row_count = SUM(p.[rows])
        , pages = SUM(
            CASE
                WHEN a.[type] != 1 AND p.index_id < 2 THEN a.used_pages
                WHEN p.index_id < 2 THEN a.data_pages ELSE 0
            END
            )
    FROM sys.partitions p
    JOIN sys.allocation_units a ON p.[partition_id] = a.container_id
     WHERE p.index_id IN (0, 1)
     GROUP BY p.[object_id]
) r ON r.[object_id] = o.[object_id]
WHERE o.[type] = 'U' 
ORDER BY r.pages DESC
于 2013-07-22T12:51:46.150 回答