系統表儲存 SQL Server 所有元資料,通常以 sys 開頭。掌握系統表可實現動態 SQL 建構、物件存在性檢查、批量 DDL 操作等進階管理。
| 系統表 | 範圍 | 主要內容 |
|---|---|---|
| sys.syslogins / sys.server_principals | 伺服器層級 | 登入帳號、角色、權限 |
| sys.databases | 伺服器層級 | 所有資料庫屬性 |
| sys.systypes / sys.types | 資料庫層級 | 系統/使用者定義資料類型 |
| sys.sysusers / sys.database_principals | 資料庫層級 | 資料庫使用者、角色 |
| sys.sysobjects / sys.objects | 資料庫層級 | 所有物件 (表、視圖、SP、索引、約束...) |
| 代碼 | 物件類型 |
|---|---|
| U | 使用者資料表 |
| V | 檢視表 |
| P | 預存程序 |
| FN | 標量函數 |
| IF | 內嵌資料表值函數 |
| TF | 多陳述式資料表值函數 |
| PK | 主鍵約束 |
| F | 外來鍵約束 |
| D | 預設值約束 |
| C | CHECK 約束 |
-- 資料庫
IF EXISTS (SELECT 1 FROM sys.databases WHERE name = 'MyDB')
PRINT 'DB exists';
-- 使用者表
IF EXISTS (SELECT 1 FROM sys.objects WHERE name = 'MyTable' AND type = 'U')
PRINT 'Table exists';
SELECT name, create_date, modify_date
FROM sys.objects
WHERE type = 'U' AND is_ms_shipped = 0
ORDER BY name;
SELECT name, create_date
FROM sys.objects
WHERE type = 'P' AND is_ms_shipped = 0;
SELECT 'DROP TABLE ' + QUOTENAME(SCHEMA_NAME(schema_id)) + '.' + QUOTENAME(name) + ';'
FROM sys.objects
WHERE type = 'U' AND is_ms_shipped = 0;
SELECT 'ALTER INDEX ALL ON ' + QUOTENAME(SCHEMA_NAME(o.schema_id)) + '.' + QUOTENAME(o.name) + ' REBUILD;'
FROM sys.objects o
WHERE o.type = 'U' AND o.is_ms_shipped = 0;
SELECT c.name, t.name AS type_name, c.max_length, c.precision, c.scale, c.is_nullable, c.is_identity
FROM sys.columns c
JOIN sys.types t ON c.user_type_id = t.user_type_id
WHERE c.object_id = OBJECT_ID('dbo.MyTable')
ORDER BY c.column_id;
建議使用目錄檢視 (sys.objects, sys.columns, sys.indexes...) 而非舊版系統表 (sysobjects, syscolumns...),原因:
查詢系統表/目錄檢視需要 VIEW DEFINITION、VIEW DATABASE STATE 或資料庫擁有者權限。