SqlServer用sql查询元数据详细的常用操作

SqlServer的元数据查询不需要像Mysql那样语句中指定库,只需要用连接工具连接到希望操作的库的模式下就可以了

--查询表注释
SELECT 
	DISTINCT d.name,
	f.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 sys.extended_properties g ON a.id= G.major_id
	AND a.colid= g.minor_id
LEFT JOIN sys.extended_properties f ON d.id= f.major_id
	AND f.minor_id= 0
	
--查询更加详细的信息
SELECT 
	d.name 表名,
	o.value 表备注,
	a.colorder 字段序号,
	a.name 字段名,
	(case when COLUMNPROPERTY( a.id,a.name,'IsIdentity')=1 then '1'else '' end) 标识, 
	(case when (SELECT count(*) FROM sysobjects  
	WHERE (name in (SELECT name FROM sysindexes  
	WHERE (id = a.id) AND (indid in  
	(SELECT indid FROM sysindexkeys  
	WHERE (id = a.id) AND (colid in  
	(SELECT colid FROM syscolumns WHERE (id = a.id) AND (name = a.name)))))))  
	 AND (xtype = 'PK'))>0 then '1' else '' end) 是否主键,
	b.name 字段类型,
	a.length 占用字节数,  
	COLUMNPROPERTY(a.id,a.name,'PRECISION') as 字段长度,  
	isnull(COLUMNPROPERTY(a.id,a.name,'Scale'),0) as 小数位数,
	(case when a.isnullable=1 then '1'else '' end) 是否允许空,
	isnull(e.text,'') 默认值,isnull(g.[value], ' ') AS [字段说明]
FROM  syscolumns a 
left join systypes b on a.xtype=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 sys.extended_properties g on a.id=g.major_id AND a.colid=g.minor_id
left join sys.extended_properties f on d.id=f.class and f.minor_id=0
left join (
	-- 出表注释语句
	SELECT 
		DISTINCT d.name,
		f.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 sys.extended_properties g ON a.id= G.major_id
		AND a.colid= g.minor_id
	LEFT JOIN sys.extended_properties f ON d.id= f.major_id
		AND f.minor_id= 0
) o on d.name = o.name
where b.name is not null
--WHERE d.name='要查询的表' 如果只查询指定表,用此条件
order by a.id,a.colorder

--查询所有表的数据行数以及数据量大小
SELECT
	a.name,
	b.rows,
	c.used
FROM         
	sys.sysobjects AS a 
INNER JOIN sys.sysindexes AS b ON a.id = b.id
INNER join (
	--里面的这个是出更加详细的空间占用情况的有需要可以单独拉出来用,我内连接这个语句只是为了出used
	SELECT
		OBJECT_NAME(id) AS tablename,
		8 * reserved / 1024 AS reserved,
		RTRIM(8 * dpages) + 'kb' AS used,
		8 * (reserved - dpages) / 1024 AS unused,
        8 * dpages / 1024 - rows / 1024 * minlen / 1024 AS free
	FROM sys.sysindexes
	WHERE (indid = 1)
) c on a.name=c.tablename
WHERE     (b.indid IN (0, 1)) AND (a.type = 'u')
ORDER BY a.id, a.name, b.rows DESC

--查询所有的库名
SELECT Name FROM Master..SysDatabases ORDER BY Name

--只查询表名
SELECT Name FROM SysObjects Where XType='U' ORDER BY Name

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值