[MS SQL]以SQL語法取得DB中Table清單

[SQL]以SQL語法取得DB中Table清單及Column明細

撰寫程式時,常需要將參考Table Schema文件以了解DB中Table的欄位內容,我自己的習慣是先寫好Schema文件,才建立Table

但有時候接手別人的專案時,並不一定有完整的文件,所以就想直接從DB中取得資訊產生文件的念頭,用以下的SQL語法可快速的取得DB中所有Table的欄位清單

SELECT st.name [Table_Name], sc.column_id [Column_Sort], sc.name [Column], ic.DATA_TYPE +
    CASE 
	WHEN ISNULL(ic.CHARACTER_MAXIMUM_LENGTH, '') = '' THEN ''
    ELSE '(' + CAST(ic.CHARACTER_MAXIMUM_LENGTH AS varchar) + ')'
    END [Data_Type], 
	ISNULL(ic.COLUMN_DEFAULT, '') [Default_Value],
    CASE sc.is_identity 
	WHEN 1 THEN 'Y'
    ELSE ''
    END [Identity],
    CASE
    WHEN ISNULL(ik.TABLE_NAME, '') <> '' THEN 'Y'
    ELSE ''
    END [PK], 
	ISNULL(sep.value, '') [Description], ISNULL(p.value, '') [Table_Description]
FROM sys.tables st
INNER JOIN sys.columns sc
    ON st.object_id = sc.object_id
INNER JOIN INFORMATION_SCHEMA.COLUMNS ic
    ON ic.TABLE_NAME = st.name
        AND ic.COLUMN_NAME = sc.name
LEFT JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE ik
    ON ik.TABLE_NAME = ic.TABLE_NAME
        AND ik.COLUMN_NAME = ic.COLUMN_NAME
LEFT JOIN sys.extended_properties sep
    ON st.object_id = sep.major_id
        AND sc.column_id = sep.minor_id
        AND sep.name = 'MS_Description'
LEFT JOIN sys.extended_properties p
    ON p.major_id = st.object_id
        AND p.minor_id = 0
        AND p.name = 'MS_Description'
ORDER BY  st.name, sc.column_id

以北風資料庫為例,產生的資料如下:

其中Description需要在Column中自行輸入說明,輸入的位置如下圖圖:

Table_Description則是Table的說明,可在Table屬性的擴充屬性中輸入名稱="MS_Description",值=Table的說明文字,如下圖:

抓出來的資料,配上[NPOI]以ASP .NET配上NPOI 2.2.1產生xlsx檔,就可以輕鬆產出Table Schema文件。