元数据简介
元数据 (metadata) 最常见的定义为"有关数据的结构数据",或者再简单一点就是"关于数据的信息",日常生活中的图例、图书馆目录卡和名片等都可以看作是元数据。在关系型数据库管理系统 (DBMS) 中,元数据描述了数据的结构和意义。比如在管理、维护 SQL Server 或者是开发数据库应用程序的时候,我们经常要获取一些涉及到数据库架构的信息:
常用的信息架构视图有以下一些:
信息架构视图 | 描述 |
---|---|
INFORMATION_SCHEMA .CHECK_CONSTRAINTS | 返回有关列或过程参数的信息,如是否允许空值,是否为计算列等。 |
INFORMATION_SCHEMA .COLUMNS | 返回当前数据库中当前用户可以访问的所有列及其基本信息。 |
INFORMATION_SCHEMA .CONSTRAINT_COLUMN_USAGE | 返回当前数据库中定义了约束的所有列及其约束名。 |
INFORMATION_SCHEMA .CONSTRAINT_TABLE_USAGE | 返回当前数据库中定义了约束的所有表及其约束名。 |
INFORMATION_SCHEMA .KEY_COLUMN_USAGE | 返回当前数据库中作为主键/外键约束的所有列。 |
INFORMATION_SCHEMA .SCHEMATA | 返回当前用户具有权限的所有数据库及其基本信息。 |
INFORMATION_SCHEMA .TABLES | 返回当前用户具有权限的当前数据库中的所有表或者视图及其基本信息。 |
INFORMATION_SCHEMA .VIEWS | 返回当前数据库中的当前用户可以访问的视图及其所有者、定义等信息。 |
由于这些信息架构都是以视图的方式存在的,因此我们可以很方便地获得并利用需要的信息。 所以很容易的利用数据库元数据信息实现ORM功能,下面是几个常用的SQL
//获取表的所有列
public const string TABLE_COLUMN_SQL = " SELECT TABLE_CATALOG AS [Database], TABLE_SCHEMA AS Owner, TABLE_NAME AS TableName, COLUMN_NAME AS ColumnName, " +
"ORDINAL_POSITION AS OrdinalPosition, COLUMN_DEFAULT AS DefaultSetting, IS_NULLABLE AS IsNullable, DATA_TYPE AS DataType, " +
"CHARACTER_MAXIMUM_LENGTH AS MaxLength, NUMERIC_PRECISION AS Precision, DATETIME_PRECISION AS DatePrecision " +
"FROM INFORMATION_SCHEMA.COLUMNS " +
"WHERE (TABLE_NAME = @tblName) ";
//获取表的所有存储过程和参数
public const string SP_PARAM_SQL="SELECT SPECIFIC_CATALOG AS [Database], SPECIFIC_SCHEMA AS Owner, SPECIFIC_NAME AS SPName, ORDINAL_POSITION AS OrdinalPosition, " +
"PARAMETER_MODE AS ParamType, IS_RESULT AS IsResult, PARAMETER_NAME AS Name, DATA_TYPE AS DataType, " +
"CHARACTER_MAXIMUM_LENGTH AS DataLength, REPLACE(PARAMETER_NAME, '@', '') AS CleanName " +
"FROM INFORMATION_SCHEMA.PARAMETERS " +
"WHERE SPECIFIC_NAME=@spName";
//获取表的所有存储过程的Sql
public const string SP_SQL = " SELECT SPECIFIC_CATALOG AS [Database], SPECIFIC_SCHEMA AS Owner, SPECIFIC_NAME AS Name, ROUTINE_DEFINITION AS SQL, CREATED AS CreatedOn, " +
"LAST_ALTERED AS ModifiedOn " +
"FROM INFORMATION_SCHEMA.ROUTINES " +
"WHERE (SPECIFIC_NAME = @spName) ";
//获取表的所有存储过程
public const string TABLE_SQL = "SELECT TABLE_CATALOG AS [Database], TABLE_SCHEMA AS Owner, TABLE_NAME AS Name, TABLE_TYPE "+
"FROM INFORMATION_SCHEMA.TABLES "+
"WHERE (TABLE_TYPE = 'BASE TABLE') AND (TABLE_NAME <> N'sysdiagrams') " +
"AND TABLE_NAME=@tblName";