文章目录 目的相关资料获取数据表字段信息(sys.columns)获取数据类型信息(sys.types)获取索引信息(sys.indexes)获取索引字段信息(sys.index_columns) 示例 目的
在做SQL开发的过程中,可能需要获取所有表的主键信息,此时就需要用到SQL Server中的系统表进行多表联查,获取数据表的相关信息。
相关资料 获取数据表字段信息(sys.columns)首先可以利用系统表中的syscolumns表获取某一数据表的字段信息。示例:
SELECT object_id, name, column_id, system_type_id, max_length, precision, scale, is_nullable FROM sys.columns该示例提供sys.columns表中较为常用的几列,其中:
在sys.columns中的字段类型是以Id作为标识,所以不能直观的看出该字段的类型所以可以根据systypes表获取该字段的类型名称。示例:
SELECT name, system_type_id, max_length, precision, scale FROM sys.types其中挑选了常用的两个字段:
通过系统表sys.indexes获取数据表的索引信息。示例:
SELECT object_id, name, index_id, type, type_desc, is_unique, is_primary_key FROM sys.indexes在sys.indexes表中只能查找到索引的名称和信息,但是对于索引中包含的字段不能够直接读出。因此可以与sys.index_columns联查寻找索引包含的字段。示例:
SELECT object_id, index_id, column_id FROM sys.index_columns通过以上三个表的联查,可以获取某一数据表的包含字段信息的索引。示例:
-- 获取索引及索引字段信息 SELECT idx.name, idx.type_desc, cols.name, types.name, cols.max_length, cols.precision, cols.scale, cols.is_nullable FROM sys.index_columns idxcols INNER JOIN sys.indexes idx ON idx.object_id = idxcols.object_id AND idx.index_id = idxcols.index_id INNER JOIN sys.columns cols ON idx.object_id = cols.object_id AND idxcols.column_id = cols.column_id INNER JOIN sys.types types ON cols.system_type_id = types.system_type_id WHERE idxcols.object_id = object_id('table_name') ORDER BY idx.index_id查询数据表的表结构
BEGIN DECLARE @tableName varchar(128) = 'table_name' ;WITH primaryKeys AS ( SELECT cols.name [primaryKey], 'PK' [name] FROM sys.index_columns indexCols INNER JOIN sys.columns cols ON indexCols.object_id = cols.object_id AND indexCols.column_id = cols.column_id INNER JOIN sys.indexes inds ON indexCols.object_id = inds.object_id AND indexCols.index_id = inds.index_id WHERE indexCols.object_id = OBJECT_ID(@tableName, 'u') AND inds.is_primary_key = 1 ) SELECT cols.name [字段], types.name [数据类型], (CASE WHEN cols.max_length = types.max_length THEN '' WHEN cols.max_length = '-1' THEN 'max' WHEN cols.system_type_id = 108 THEN '(' + convert(VARCHAR, cols.precision) + ',' + convert(VARCHAR, cols.scale) + ')' ELSE CONVERT(varchar, cols.max_length) END) [长度], (CASE WHEN cols.is_nullable = 0 THEN 'Y' ELSE '' END) [非空], ISNULL(pk.name, '') [主键], '' [描述] FROM sys.columns cols INNER JOIN sys.types types ON cols.system_type_id = types.system_type_id LEFT JOIN primaryKeys pk ON pk.primaryKey = cols.name WHERE cols.object_id = OBJECT_ID(@tableName, 'U') ORDER BY cols.column_id END
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。 |