如何取数据库表的结构信息

dave 2005-04-05 03:38:45
如何取数据库表的结构信息,
包括 所有字段的名称,数据类型,字段大小,该字段已有数据中最长数据的长度.
...全文
139 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
dave 2005-04-05
  • 打赏
  • 举报
回复
谢谢邹建老师
zjcxc 元老 2005-04-05
  • 打赏
  • 举报
回复
上面的已经加上表中数据的最大长度,不过,你的数据多的话,效率会成问题.
zjcxc 元老 2005-04-05
  • 打赏
  • 举报
回复
create table #t(id int,colid int,datalen bigint)
exec sp_msforeachtable @command1=N'
declare @s1 nvarchar(4000),@s2 nvarchar(4000)
select @s1='''',@s2=''''
select @s1=@s1+'' union all select ''
+rtrim(c.id)+'',''
+rtrim(c.colid)+'',''
+quotename(c.colid)+'' from #'',
@s2=@s2+N'',''+quotename(c.colid)+''=max(''+case
when t.name in(''sql_variant'',''image'',''money'')
or t.name like ''%text''
or t.name like ''%binary''
then ''datalength'' else ''len'' end
+''(''+quotename(c.name)+''))''
from syscolumns c,systypes t
where c.xusertype=t.xusertype
and object_id(''?'')=c.id
order by colid
select @s1=stuff(@s1,1,10,''''),
@s2=stuff(@s2,1,1,'''')
exec(''select ''+@s2+'' into # from ? insert #t ''+@s1)'
--,@whereand=' and o.name=''要查询的表''' --如果只查询指定表,加上此条件

SELECT
表名=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'),
已有数据的最大长度=data.datalen,
小数位数=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
inner join #t data on a.id=data.id and a.colid=data.colid
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
drop table #t

zjcxc 元老 2005-04-05
  • 打赏
  • 举报
回复
字段已有数据中最长数据的长度,这个必须查实际的表,实现起来比较麻烦,严重影响效率.
dave 2005-04-05
  • 打赏
  • 举报
回复
邹建老师:
字段已有数据中最长数据的长度在什么位置.小的太菜.
jackbaby 2005-04-05
  • 打赏
  • 举报
回复
我到 ,我爱死你了 !!邹老大!!
下辈子做女人,嫁给你,做小的都行!!!奶奶的 ,强悍!!!!
mich1234 2005-04-05
  • 打赏
  • 举报
回复
select * from information_Schema.columns
zjcxc 元老 2005-04-05
  • 打赏
  • 举报
回复
SELECT
表名=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

34,593

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧