首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 2005/2008 遍歷所有使用者表統計列數:游標動態 SQL 實作

     編輯:關於SqlServer

功能說明

在當前資料庫中迴圈遍歷所有使用者表 (sys.tables, type='U'),動態執行 SELECT COUNT(1) 並列印表名與列數,適用於快速掌握資料量分佈。

完整腳本

DECLARE CountTableRecords CURSOR READ_ONLY FOR
SELECT sst.name, SCHEMA_NAME(sst.schema_id)
FROM sys.tables sst
WHERE sst.type = 'U';

DECLARE @name VARCHAR(80), @schema VARCHAR(40);

OPEN CountTableRecords;
FETCH NEXT FROM CountTableRecords INTO @name, @schema;

WHILE (@@FETCH_STATUS <> -1)
BEGIN
    IF (@@FETCH_STATUS <> -2)
    BEGIN
        PRINT @name;
        DECLARE @sql NVARCHAR(1024);
        SET @sql = 'DECLARE @count INT; ' +
                   'SELECT @count = COUNT(1) FROM ' + QUOTENAME(@schema) + '.' + QUOTENAME(@name) + '; ' +
                   'PRINT @count;';
        EXEC sp_executesql @sql;
    END
    FETCH NEXT FROM CountTableRecords INTO @name, @schema;
END

CLOSE CountTableRecords;
DEALLOCATE CountTableRecords;
GO

關鍵點解析

  1. READ_ONLY 游標:唯讀順向,開銷最小。
  2. SCHEMA_NAME(schema_id):取得結構描述名,配合 QUOTENAME 防止特殊字元/注入。
  3. sp_executesql 替代 EXEC(@sql):參數化潛力、計畫重用更佳 (此處無參數但屬好習慣)。
  4. COUNT(1) vs COUNT(*):現代優化器等價,習慣用 COUNT(1)。

進階替代方案 (無游標、效能更佳)

-- 利用系統目錄快速估算 (不掃描資料頁)
SELECT 
    SCHEMA_NAME(t.schema_id) AS SchemaName,
    t.name AS TableName,
    p.rows AS RowCount
FROM sys.tables t
JOIN sys.partitions p ON p.object_id = t.object_id
WHERE t.type = 'U' AND p.index_id IN (0,1)  -- heap 或 clustered index
ORDER BY p.rows DESC;

差異:sys.partitions.rows 為統計資料估算值 (可能過時),COUNT(1) 為即時精確值。大表估算誤差可接受時優先用目錄查詢,毫秒級完成;需精確值時再用游標逐表統計。

總結

游標動態 SQL 版本適合精確統計需求;目錄視圖版本適合快速概覽。兩者互補,視場景選擇。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved