方法一
SELECT
序号=C.column_id,
列名=C.name,
是否主键=ISNULL(IDX.PrimaryKey,N''),
数据类型=T.name,
长度=C.max_length,
Precision=C.precision,
小数位=C.scale,
允许空=CASE WHEN C.is_nullable=1 THEN N'是'ELSE N'否' END,
默认值=ISNULL(D.definition,N''),
说明=ISNULL(PFD.[value],N'')
FROM sys.columns C
INNER JOIN sys.objects O
ON C.[object_id]=O.[object_id]
AND O.type='U'
AND O.is_ms_shipped=0
INNER JOIN sys.types T
ON C.user_type_id=T.user_type_id
LEFT JOIN sys.default_constraints D
ON C.[object_id]=D.parent_object_id
AND C.column_id=D.parent_column_id
AND C.default_object_id=D.[object_id]
LEFT JOIN sys.extended_properties PFD
ON PFD.class=1
AND C.[object_id]=PFD.major_id
AND C.column_id=PFD.minor_id
LEFT JOIN sys.extended_properties PTB
ON PTB.class=1
AND PTB.minor_id=0
AND C.[object_id]=PTB.major_id
LEFT JOIN -- 索引及主键信息
(
SELECT
IDXC.[object_id],
IDXC.column_id,
Sort=CASE INDEXKEY_PROPERTY(IDXC.[object_id],IDXC.index_id,IDXC.index_column_id,'IsDescending')
WHEN 1 THEN 'DESC' WHEN 0 THEN 'ASC' ELSE '' END,
PrimaryKey=CASE WHEN IDX.is_primary_key=1 THEN N'是'ELSE N'否' END,
IndexName=IDX.Name
FROM sys.indexes IDX
INNER JOIN sys.index_columns IDXC
ON IDX.[object_id]=IDXC.[object_id]
AND IDX.index_id=IDXC.index_id
LEFT JOIN sys.key_constraints KC
ON IDX.[object_id]=KC.[parent_object_id]
AND IDX.index_id=KC.unique_index_id
INNER JOIN -- 对于一个列包含多个索引的情况,只显示第1个索引信息
(
SELECT [object_id], Column_id, index_id=MIN(index_id)
FROM sys.index_columns
GROUP BY [object_id], Column_id
) IDXCUQ
ON IDXC.[object_id]=IDXCUQ.[object_id]
AND IDXC.Column_id=IDXCUQ.Column_id
AND IDXC.index_id=IDXCUQ.index_id
) IDX
ON C.[object_id]=IDX.[object_id]
AND C.column_id=IDX.column_id
WHERE C.object_id= object_id('dbo.CRM_商店') -- 指定表
ORDER BY O.name,C.column_id
方法二
SELECT S.name ColumName
,(
CASE
WHEN S.is_nullable=1 THEN N'是'
ELSE N'否' END
) AS AllowNULL
,S.max_length MaxLength
,TYPESYSTABLE.name DateType
FROM sys.Columns S
INNER JOIN sys.types TYPESYSTABLE ON S.system_type_id = TYPESYSTABLE.system_type_id
WHERE S.object_id= object_id(@TableName)
AND TYPESYSTABLE.name != 'sysname'
方法三(优化方法一)
SELECT S.column_id 序号
,S.name 列名称
,ISNULL(IDX.PrimaryKey,N'否') 主键
,(
CASE
WHEN S.is_nullable=1 THEN N'是'
ELSE N'否'
END
) AS 是否允许空
,S.max_length 长度
,TYPESYSTABLE.name 数据类型
,S.scale 小数位
,ISNULL(D.definition,N'') 默认值
,ISNULL(PFD.[value],N'') 说明
FROM sys.Columns S
INNER JOIN sys.types TYPESYSTABLE ON S.system_type_id = TYPESYSTABLE.system_type_id
INNER JOIN sys.objects O ON S.[object_id]=O.[object_id]
AND O.type='U'
AND O.is_ms_shipped=0
LEFT JOIN sys.default_constraints D ON S.[object_id]=D.parent_object_id
AND S.column_id=D.parent_column_id
AND S.default_object_id=D.[object_id]
LEFT JOIN sys.extended_properties PFD ON PFD.class=1
AND S.[object_id]=PFD.major_id
AND S.column_id=PFD.minor_id
LEFT JOIN -- 索引及主键信息
( SELECT
IDXC.[object_id],
IDXC.column_id,
Sort=CASE INDEXKEY_PROPERTY(IDXC.[object_id],IDXC.index_id,IDXC.index_column_id,'IsDescending')
WHEN 1 THEN 'DESC' WHEN 0 THEN 'ASC' ELSE '' END,
PrimaryKey=CASE WHEN IDX.is_primary_key=1 THEN N'是'ELSE N'否' END,
IndexName=IDX.Name
FROM sys.indexes IDX
INNER JOIN sys.index_columns IDXC ON IDX.[object_id]=IDXC.[object_id]
AND IDX.index_id=IDXC.index_id
LEFT JOIN sys.key_constraints KC ON IDX.[object_id]=KC.[parent_object_id]
AND IDX.index_id=KC.unique_index_id
INNER JOIN -- 对于一个列包含多个索引的情况,只显示第1个索引信息
(
SELECT [object_id], Column_id, index_id=MIN(index_id)
FROM sys.index_columns
GROUP BY [object_id], Column_id
) IDXCUQ ON IDXC.[object_id]=IDXCUQ.[object_id]
AND IDXC.Column_id=IDXCUQ.Column_id
AND IDXC.index_id=IDXCUQ.index_id
) IDX ON S.[object_id]=IDX.[object_id]
AND S.column_id=IDX.column_id
WHERE S.object_id= object_id('CRM_商店')
AND TYPESYSTABLE.name != 'sysname'
ORDER BY O.name, S.column_id