開發資料庫匯出 Excel、產生文件、程式碼產生器等工具時,需要一次性取得所有使用者資料表的欄位完整定義。
SELECT
Sysobjects.Name AS Tb_name,
Syscolumns.Name AS Col_name,
Systypes.Name AS Col_type,
Syscolumns.Length AS Col_len,
ISNULL(Sysproperties.Value, Syscolumns.Name) AS Col_memo,
CASE WHEN Syscolumns.Name IN (
SELECT A.Name
FROM Syscolumns A
INNER JOIN Sysobjects B ON A.Id = B.Id AND B.xtype = 'U' AND B.Name <> 'dtproperties'
WHERE EXISTS (
SELECT 1 FROM Sysobjects
WHERE xtype = 'PK'
AND Name IN (
SELECT Name FROM Sysindexes
WHERE Indid IN (
SELECT Indid FROM Sysindexkeys
WHERE Id = A.Id AND Colid = A.Colid
)
)
)
AND B.Name = Sysobjects.Name
) THEN 1 ELSE 0 END AS Is_key
FROM Sysobjects, Systypes, Syscolumns
LEFT JOIN Sysproperties ON (Syscolumns.Id = Sysproperties.Id AND Syscolumns.Colid = Sysproperties.Smallid)
WHERE (Sysobjects.xtype = 'U' OR Sysobjects.xtype = 'V')
AND Sysobjects.Id = Syscolumns.Id
AND Systypes.xtype = Syscolumns.xtype
AND Systypes.Name <> 'sysname'
ORDER BY Sysobjects.Name, Syscolumns.Colid;
| 欄位 | 含義 |
|---|---|
| Tb_name | 資料表名稱 |
| Col_name | 欄位名稱 |
| Col_type | 資料類型 |
| Col_len | 長度(位元組) |
| Col_memo | 欄位描述(擴展屬性 MS_Description),無則顯示欄位名 |
| Is_key | 是否為主鍵欄位(1=是,0=否) |

xtype='U')與檢視表(xtype='V')。Sysindexes、Sysindexkeys 關聯 Sysobjects(xtype='PK')反推。INFORMATION_SCHEMA.COLUMNS 與 sys.extended_properties 視圖,語法更標準且支援 Unicode。