SqlServer表結構查詢


一、前言

  近兩天項目升級數據遷移,將老版本(sqlserver)的數據遷移到新版本(mysql)數據庫,需要整理一個Excel表格出來,映射兩個庫之間的表格字段,示例如下:

  

  Mysql數據庫查詢表結構很方便,用客戶端(SQLyog)可以直接復制出需要的表結構,據說可以用簡單的命令查詢表結構,但是不會...

  Sqlserver導出表結構就很坑爹了,首先呢客戶端不支持,表設計頁面雖說可以復制表結構但是不包含字段注釋,想想這種場景應該很常見不可能沒有解決方案的,於是在網上發現了一段腳本,稍加調整就可以查詢出需要的表結構

 

二、腳本及查詢示例

 1 SELECT  表名 = CASE WHEN a.colorder = 1 THEN d.name ELSE '' END ,
 2         字段說明 = ISNULL(g.[value], '') ,
 3         字段名 = a.name ,
 4         類型 = CASE WHEN b.name IN ( 'varchar', 'nvarchar' )
 5                   THEN b.name + '('
 6                        + CAST(COLUMNPROPERTY(a.id, a.name, 'PRECISION') AS VARCHAR(4))
 7                        + ')'
 8                   WHEN b.name = 'decimal'
 9                   THEN b.name + '('
10                        + CAST(COLUMNPROPERTY(a.id, a.name, 'PRECISION') AS VARCHAR(4))
11                        + ','
12                        + CAST(COLUMNPROPERTY(a.id, a.name, 'Scale') AS VARCHAR(4))
13                        + ')'
14                   ELSE b.name
15              END
16 FROM syscolumns a    -- 列名
17     LEFT JOIN systypes b ON a.xusertype = b.xusertype    -- 類型
18     INNER JOIN sysobjects d ON a.id = d.id AND d.xtype = 'U' AND d.name <> 'dtproperties'    --篩選用戶對象
19     --LEFT JOIN syscomments e ON a.cdefault = e.id    --默認值
20     LEFT JOIN sys.extended_properties g ON a.id = g.major_id AND a.colid = g.minor_id    --擴展屬性(字段說明)
21     --LEFT JOIN sys.extended_properties f ON d.id = f.major_id AND f.minor_id = 0        --擴展屬性(表說明)
22 WHERE d.name = 'Merchant'    --可修改表名
23 ORDER BY a.id , a.colorder  
View Code

 

  

 

三、參考鏈接

  http://blog.csdn.net/shandian534/article/details/39249245

 

四、腳本解讀

syscolumns
為每個表和視圖中的每列返回一行,並為數據庫中的存儲過程的每個參數返回一行。
name 列名或過程參數的名稱。
id 此列所屬表的對象 ID,或者與此參數關聯的存儲過程的 ID
xusertype 擴展的用戶定義數據類型的 ID
colid 列 ID 或參數 ID

 

 

 

 

 

systypes
對於每種系統提供數據類型和用戶定義數據類型,均包含一行信息。
name 數據類型名稱
xusertype 擴展用戶類型

 

 

 

sysobjects
在數據庫中創建的每個對象(例如約束、默認值、日志、規則以及存儲過程)都對應一行
id  對象標識號
xtype  對象類型。 可以是以下對象類型之一:

AF = 聚合函數 (CLR)

C = CHECK 約束

D = 默認值或 DEFAULT 約束

F = FOREIGN KEY 約束

L = 日志

FN = 標量函數

FS = 程序集 (CLR) 標量函數

FT = 程序集 (CLR) 表值函數

IF = 內聯表函數

IT = 內部表

P = 存儲過程

PC = 程序集 (CLR) 存儲過程

PK = PRIMARY KEY 約束(type 為 K)

RF = 復制篩選存儲過程

S = 系統表

SN = 同義詞

SQ = 服務隊列

TA = 程序集 (CLR) DML 觸發器

TF = 表函數

TR = SQL DML 觸發器

TT = 表類型

U = 用戶表

UQ = UNIQUE 約束(type 為 K)

V = 視圖

X = 擴展存儲過程
name 對象名(dtproperties自動生成表此處不討論

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

sys.extended_properties
針對當前數據庫中的每個擴展屬性返回一行
class

標識其上存在屬性的項類。 可以是下列值之一:

0 = 數據庫

1 = 對象或列

2 = 參數

3 = 架構

4 = 數據庫主體

5 = 程序集

6 = 類型

7 = 索引

10 = XML 架構集合

15 = 消息類型

16 = 服務約定

17 = 服務

18 = 遠程服務綁定

19 = 路由

20 = 數據空間(文件組或分區方案)

21 = 分區函數

22 = 數據庫文件

27 = 計划指南

major_id

其上存在擴展屬性的項的 ID,根據項類進行解釋。 對於大多數項,該 ID 適用於類所表示的項。 下列是非標准主 ID 的解釋:

如果 class 為 0,則 major_id 始終為 0。

如果 class 為 1、2 或 7,則 major_id 為 object_id。

minor_id

其上存在擴展屬性的項的輔助 ID,根據項類進行解釋。 對於大多數項,ID 為 0;否則,ID 為下列值之一:

如果 class = 1,則 minor_id 在項為列的情況下等於 column_id,在項為對象的情況下等於 0。

如果 class = 2,則 minor_id 為 parameter_id。

如果 class = 7,則 minor_id 為 index_id。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

COLUMNPROPERTY
返回有關列或參數的信息
參數:
id 一個表達式,其中包含表或過程的標識符 (ID)
column 一個表達式,其中包含列或參數的名稱
property 一個表達式,其中包含要為 id 返回的信息


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM