获取MS SQL库数据字典的经典SQL语句SELECT sysobjects.name AS [table], sysproperties.[value] AS 表说明, 
      syscolumns.name AS field, properties.[value] AS 字段说明, systypes.name AS type, 
      syscolumns.length, ISNULL(COLUMNPROPERTY(syscolumns.id, syscolumns.name, 
      'Scale'), 0) AS 小数位数, syscolumns.isnullable AS isnull, 
      CASE WHEN syscomments.text IS NULL 
      THEN '' ELSE syscomments.text END AS [Default], 
      CASE WHEN COLUMNPROPERTY(syscolumns.id, syscolumns.name, 'IsIdentity') 
      = 1 THEN '√' ELSE '' END AS 标识, CASE WHEN EXISTS
          (SELECT 1
         FROM sysobjects
         WHERE xtype = 'PK' AND name IN
                   (SELECT name
                  FROM sysindexes
                  WHERE indid IN
                            (SELECT indid
                           FROM sysindexkeys
                           WHERE id = syscolumns.id AND colid = syscolumns.colid))) 
      THEN '√' ELSE '' END AS 主键
FROM syscolumns INNER JOIN
      sysobjects ON sysobjects.id = syscolumns.id INNER JOIN
      systypes ON syscolumns.xtype = systypes.xtype LEFT OUTER JOIN
      sysproperties properties ON syscolumns.id = properties.id AND 
      syscolumns.colid = properties.smallid LEFT OUTER JOIN
      sysproperties ON sysobjects.id = sysproperties.id AND 
      sysproperties.smallid = 0 LEFT OUTER JOIN
      syscomments ON syscolumns.cdefault = syscomments.id
WHERE (sysobjects.xtype = 'U') 

解决方案 »

  1.   

    SELECT --TableName=o.name,OWNER=USER_NAME(o.uid),TableDescription=ISNULL(ptb.value,N''),
    TableName=CASE WHEN c.colid=1 THEN o.name ELSE N'' END,
    OWNER=CASE WHEN c.colid=1 THEN USER_NAME(o.uid) ELSE N'' END,
    TableDescription=CASE WHEN c.colid=1 THEN ISNULL(ptb.value,N'') ELSE N'' END,
    FieldId=c.colid,FieldName=c.name,
    FieldType=QUOTENAME(t.name)
    +CASE 
    WHEN t.name IN (N'decimal',N'numeric')
    THEN N'('+CAST(c.prec as varchar)+N','+CAST(c.scale as varchar)+N')'
    WHEN t.name IN (N'float')
    OR t.name like N'%char'
    OR t.name like N'%binary'
    THEN N'('+CAST(c.prec as varchar)+N')'
    ELSE N'' END
    +CASE WHEN c.isnullable=1 THEN N'' ELSE N' NOT' END+N' NULL',
    FieldDescription=ISNULL(pfd.value,''),
    DefileLength=c.length,
    FieldDefault=ISNULL(df.text,N''),
    IsIDENTITY=CASE WHEN COLUMNPROPERTY(o.id,c.name,N'IsIdentity')=1 THEN N'√' ELSE N'' END,
    IsComputed=CASE WHEN COLUMNPROPERTY(o.id,c.name,N'IsComputed')=1 THEN N'√' ELSE N'' END,
    IsROWGUID=CASE WHEN COLUMNPROPERTY(o.id,c.name,N'IsRowGuidCol')=1 THEN N'√' ELSE N'' END,
    IsPrimaryKey=CASE WHEN opk.xtype IS NULL THEN N'' ELSE N'√' END
    FROM sysobjects o
    JOIN syscolumns c
    ON c.id=o.id
    AND OBJECTPROPERTY(o.id,N'IsUserTable')=1
    -- AND o.name=N'要查询的表名'
    -- AND c.name=N'要查询的列名'
    JOIN systypes t
    ON t.xusertype=c.xusertype
    LEFT JOIN syscomments df
    ON df.id=c.cdefault
    LEFT JOIN sysproperties ptb
    ON ptb.id=o.id and ptb.smallid=0
    LEFT JOIN sysproperties pfd
    ON pfd.id=o.id and pfd.smallid=c.colid
    LEFT JOIN sysindexkeys idxk
    ON idxk.id=o.id
    AND idxk.colid=c.colid
    LEFT JOIN sysindexes idx
    ON idx.indid=idxk.indid
    AND idx.id=idxk.id
    AND idx.indid NOT IN(0,255)
    LEFT JOIN sysobjects opk
    ON opk.parent_obj=o.id
    AND opk.name=idx.name
    AND OBJECTPROPERTY(opk.id,N'IsPrimaryKey')=1
    ORDER BY o.name,c.colidSELECT 
    表名=case when a.colorder=1 then d.name else '' end,
    表说明=case when a.colorder=1 then isnull(f.value,'') else '' end,
    字段序号=a.colorder,
    字段名=a.name,
    标识=case when COLUMNPROPERTY( a.id,a.name,'IsIdentity')=1 then '√'else '' end,
    主键=case when exists(SELECT 1 FROM sysobjects where xtype='PK' and parent_obj=a.id and name in (
    SELECT name FROM sysindexes WHERE indid in(
    SELECT indid FROM sysindexkeys WHERE id = a.id AND colid=a.colid
    ))) then '√' else '' end,
    类型=b.name,
    占用字节数=a.length,
    长度=COLUMNPROPERTY(a.id,a.name,'PRECISION'),
    小数位数=isnull(COLUMNPROPERTY(a.id,a.name,'Scale'),0),
    允许空=case when a.isnullable=1 then '√'else '' end,
    默认值=isnull(e.text,''),
    字段说明=isnull(g.[value],'')
    FROM syscolumns a
    left join systypes b on a.xusertype=b.xusertype
    inner join sysobjects d on a.id=d.id  and d.xtype='U' and  d.name<>'dtproperties'
    left join syscomments e on a.cdefault=e.id
    left join sysproperties g on a.id=g.id and a.colid=g.smallid  
    left join sysproperties f on d.id=f.id and f.smallid=0
    --where d.name='要查询的表'    --如果只查询指定表,加上此条件
    order by a.id,a.colorder
    --显示当前库中的所有表/系统表/视图
    --如果只显示其中几项,则通过指定 @table_type 的参数列表来实现
    --TABLE        代表用户表
    --SYSTEM TABLE 代表系统表
    --VIEW         代表视图
    exec sp_tables @table_type='''TABLE'',''SYSTEM TABLE'',''VIEW'''--显示指定表的表结构信息,sysobjects 是要显示的表名
    exec sp_columns 'sysobjects'SELECT TableName=o.name,OWNER=USER_NAME(o.uid),TableDescription=ISNULL(ptb.value,N''),
    FieldId=c.colid,FieldName=c.name,
    FieldType=QUOTENAME(t.name)
    +CASE 
    WHEN t.name IN (N'decimal',N'numeric')
    THEN N'('+CAST(c.prec as varchar)+N','+CAST(c.scale as varchar)+N')'
    WHEN t.name IN (N'float')
    OR t.name like N'%char'
    OR t.name like N'%binary'
    THEN N'('+CAST(c.prec as varchar)+N')'
    ELSE N'' END
    +CASE WHEN c.isnullable=1 THEN N'' ELSE N' NOT' END+N' NULL',
    FieldDescription=ISNULL(pfd.value,''),
    DefileLength=c.length,
    FieldDefault=ISNULL(df.text,N''),
    IsIDENTITY=COLUMNPROPERTY(o.id,c.name,N'IsIdentity'),
    IsComputed=COLUMNPROPERTY(o.id,c.name,N'IsComputed'),
    IsROWGUID=COLUMNPROPERTY(o.id,c.name,N'IsRowGuidCol'),
    IsPrimaryKey=CASE WHEN opk.xtype IS NULL THEN 0 ELSE 1 END
    FROM sysobjects o
    JOIN syscolumns c
    ON c.id=o.id
    AND OBJECTPROPERTY(o.id,N'IsUserTable')=1
    JOIN systypes t
    ON t.xusertype=c.xusertype
    LEFT JOIN syscomments df
    ON df.id=c.cdefault
    LEFT JOIN sysproperties ptb
    ON ptb.id=o.id and ptb.smallid=0
    LEFT JOIN sysproperties pfd
    ON pfd.id=o.id and pfd.smallid=c.colid
    LEFT JOIN sysindexkeys idxk
    ON idxk.id=o.id
    AND idxk.colid=c.colid
    LEFT JOIN sysindexes idx
    ON idx.indid=idxk.indid
    AND idx.id=idxk.id
    AND idx.indid NOT IN(0,255)
    LEFT JOIN sysobjects opk
    ON opk.parent_obj=o.id
    AND opk.name=idx.name
    AND OBJECTPROPERTY(opk.id,N'IsPrimaryKey')=1
    ORDER BY o.name,c.colid