CREATE PROCEDURE dbo.GetTableSpaceInfo
AS
BEGIN
SET NOCOUNT ON
-- 程序本體
END
SET NOCOUNT ON 關閉「受影響列數」訊息,減少網路往返、提升效能。
CREATE PROCEDURE dbo.GetTableSpaceInfo
AS
BEGIN
SET NOCOUNT ON
-- 1. 建立結果暫存表
IF OBJECT_ID('tempdb..#TableSpaceInfo') IS NOT NULL
DROP TABLE #TableSpaceInfo
CREATE TABLE #TableSpaceInfo (
TableName SYSNAME,
RowCount BIGINT,
ReservedSpace VARCHAR(20),
DataSpace VARCHAR(20),
IndexSpace VARCHAR(20),
UnusedSpace VARCHAR(20)
)
-- 2. 宣告游標遍歷所有使用者表
DECLARE @TableName SYSNAME
DECLARE TableCursor CURSOR LOCAL FAST_FORWARD FOR
SELECT QUOTENAME(SCHEMA_NAME(schema_id)) + '.' + QUOTENAME(name)
FROM sys.tables
WHERE is_ms_shipped = 0
ORDER BY name
OPEN TableCursor
FETCH NEXT FROM TableCursor INTO @TableName
WHILE @@FETCH_STATUS = 0
BEGIN
-- 3. 動態執行 sp_spaceused
DECLARE @Cmd NVARCHAR(MAX) = N'INSERT #TableSpaceInfo EXEC sp_spaceused @tbl'
EXEC sp_executesql @Cmd, N'@tbl NVARCHAR(500)', @TableName
FETCH NEXT FROM TableCursor INTO @TableName
END
CLOSE TableCursor
DEALLOCATE TableCursor
-- 4. 回傳結果
SELECT * FROM #TableSpaceInfo ORDER BY TableName
END
| 技術 | 說明 |
|---|---|
QUOTENAME() | 安全處理含特殊字元的物件名稱,防注入 |
CURSOR LOCAL FAST_FORWARD | 唯讀、順向、僅限本連線,效能最佳 |
sp_executesql | 參數化動態 SQL,計畫快取重用、防注入 |
sp_spaceused | 系統程序,回傳表/索引空間使用統計 |
tempdb..#TableSpaceInfo | 暫存表隔離工作階段,自動清理 |
CREATE PROCEDURE dbo.GetTableSpaceInfo_V2
AS
BEGIN
SET NOCOUNT ON
SELECT
QUOTENAME(SCHEMA_NAME(t.schema_id)) + '.' + QUOTENAME(t.name) AS TableName,
p.rows AS RowCount,
CAST(SUM(a.total_pages) * 8. / 1024 AS DECIMAL(12,2)) AS ReservedMB,
CAST(SUM(CASE WHEN a.type = 1 THEN a.total_pages ELSE 0 END) * 8. / 1024 AS DECIMAL(12,2)) AS DataMB,
CAST(SUM(CASE WHEN a.type != 1 THEN a.total_pages ELSE 0 END) * 8. / 1024 AS DECIMAL(12,2)) AS IndexMB
FROM sys.tables t
JOIN sys.partitions p ON t.object_id = p.object_id AND p.index_id IN (0,1)
JOIN sys.allocation_units a ON p.partition_id = a.container_id
WHERE t.is_ms_shipped = 0
GROUP BY t.schema_id, t.name, p.rows
ORDER BY TableName
END
優點:單查詢、無游標開銷、平行化執行、易維護。新代碼首選。
THROW 重拋XACT_ABORT ON、明確 COMMIT/ROLLBACKdbo.<動詞><名詞>,如 GetTableSpaceInfoDEALLOCATE 導致記憶體洩漏## 或 #OPTION (RECOMPILE) / OPTIMIZE FOR UNKNOWN