# 使用T-SQL 匯出 DB Schema & SP、View、Fn、Trigger...
###### tags: `SQL`
## DB Schema
### 別人的範本
```
USE 資料庫名稱;
SELECT a.Table_schema +'.'+a.Table_name as 表格名稱
,b.COLUMN_NAME as 欄位名稱
,b.DATA_TYPE as 資料型別
,isnull(b.CHARACTER_MAXIMUM_LENGTH,'') as 長度
,isnull(b.COLUMN_DEFAULT,'') as 預設值
,b.IS_NULLABLE as 是否允許空值
,( SELECT value
FROM fn_listextendedproperty (NULL, 'schema', a.Table_schema, 'table', a.TABLE_NAME, 'column', default)
WHERE name='MS_Description' and objtype='COLUMN'
and objname Collate Chinese_Taiwan_Stroke_CI_AS = b.COLUMN_NAME
) as 欄位描述
FROM INFORMATION_SCHEMA.TABLES a
LEFT JOIN INFORMATION_SCHEMA.COLUMNS b ON a.TABLE_NAME = b.TABLE_NAME
WHERE TABLE_TYPE='BASE TABLE'
ORDER BY a.TABLE_NAME , b.ORDINAL_POSITION
-------------------------------------------這是指令碼------------------------------------------------------
簡單介紹一下上面的語法
--INFORMATION_SCHEMA.TABLES //查詢該資料庫裡所有資料表資訊
--INFORMATION_SCHEMA.COLUMNS //查詢該資料表裡所有資料欄位資訊
--fn_listextendedproperty //列出資料表欄位的資訊(為了取得 欄位描述 而使用)
--※Chinese_Taiwan_Stroke_CI_AS //這是指定資料庫的編碼(此為 台灣繁體中文且不分大小寫)
```

[資料來源-散步在海洋中的碼農-testAlonso](https://dotblogs.azurewebsites.net/mepowerlmay/2019/11/11/150411)
### 自己修改
```
SELECT a.Table_name as 表格名稱
,b.COLUMN_NAME as 欄位名稱
,b.DATA_TYPE as 資料型別
,CASE isnull(b.CHARACTER_MAXIMUM_LENGTH,'')
WHEN -1 then 'Max'
WHEN 0 then ''
ELSE CONVERT (nvarchar(max), isnull(b.CHARACTER_MAXIMUM_LENGTH,'')) END as 長度
--,isnull(b.COLUMN_DEFAULT,'') as 預設值
,CASE b.IS_NULLABLE
WHEN 'YES' THEN 'True'
WHEN 'NO' THEN 'False' END as 是否允許空值
,( SELECT value
FROM fn_listextendedproperty (NULL, 'schema', a.Table_schema, 'table', a.TABLE_NAME, 'column', default)
WHERE name='MS_Description' and objtype='COLUMN'
and objname Collate Chinese_Taiwan_Stroke_CI_AS = b.COLUMN_NAME
) as 欄位描述,
CASE WHEN c.COLUMN_NAME is not null THEN 'True' END as 是否為主鍵
FROM INFORMATION_SCHEMA.TABLES a
LEFT JOIN INFORMATION_SCHEMA.COLUMNS b ON a.TABLE_NAME = b.TABLE_NAME
LEFT JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE c ON a.TABLE_NAME = c.TABLE_NAME and b.COLUMN_NAME = c.COLUMN_NAME
WHERE TABLE_TYPE='BASE TABLE'
ORDER BY a.TABLE_NAME , b.ORDINAL_POSITION
```

---
## 查看 SP、View、Fn、Trigger...
```
SELECT o.name ,o.xtype , c.text FROM SYS.SYSOBJECTS o
inner join SYS.SYSCOMMENTS c on o.id =c.id
WHERE xtype <> 'D' -- D 是顯示預設值所以不看
order by xtype
```
### 物件類型 XType
* AF = 彙總函式 (CLR)
* C = CHECK 條件約束
* D = 預設值或 DEFAULT 條件約束
* F = FOREIGN KEY 條件約束
* L = 記錄 FN = 純量函數
* FS = 組件 (CLR) 純量函數
* FT = 組件 (CLR) 資料表值函式
* IF = 內嵌資料表函數
* IT = 內部資料表
* P = 預存程序
* PC = 組件 (CLR) 預存程序
* PK = PRIMARY KEY 條件約束 (類型是 K)
* RF = 複寫篩選預存程序
* S = 系統資料表
* SN = 同義字
* SQ = 服務佇列
* TA = 組件 (CLR) DML 觸發程序
* TF = 資料表函數
* TR = SQL DML 觸發程序
* TT = 資料表類型
* U = 使用者資料表
* UQ = UNIQUE 條件約束 (類型是 K)
* V = 檢視
* X = 擴充預存程序
### 查看檢視表 View 與 資料表 Table 的 欄位 Column 關連性
```
SELECT VIEW_SCHEMA, VIEW_NAME, TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME
FROM INFORMATION_SCHEMA.VIEW_COLUMN_USAGE
ORDER BY VIEW_NAME, TABLE_NAME, COLUMN_NAME;
```
[參考來源-[SQL] 條列 Stored Procedure、Function、View、Trigger
](https://blog.xuite.net/tolarku/blog/42066457)