SQL Server提供了用于获取数据库对象的元数据信息的工具,比如数据库中有什么表、表中有什么列,等等。这些工具包括目录视图(catalog view)、信息架构视图(information schema view)、系统存储过程和函数。这一方面的内容在SQL Server联机丛书的“查询 SQL Server系统目录(Querying the SQL Server System Catalog)“一节有详细的文档。
目录视图
目录视图提供了关于数据库中各对象的非常详细的信息,包括SQL Server特定的信息。例如,如果想列出数据库中的各个表,以及它们的架构名称,只要按以下所示的方法去查询sys.tables视图:
1 USE TSQLFundamentals2008
2
3 SELECT SCHEMA_NAME(schema_id) AS table_schema_name,name AS table_name
4 FROM sys.tables;
此处用SCHEMA_NAME函数把表示架构ID的整数转换成它的名称。
要得到有关某个表的列信息,可以查询sys.columns表。例如,以下代码返回Sales.Orders表中的列信息,包括列名、数据类型(用TYPE_NAME函数把系统类型ID转换成类型名称)、最大长度、排序规则名称,以及是否允许为NULL。
1 SELECT
2 name AS column_name,
3 TYPE_NAME(system_type_id) AS column_type,
4 max_length,
5 collation_name,
6 is_nullable
7 FROM sys.columns
8 WHERE object_id = OBJECT_ID (N ' Sales.Orders ' );
信息架构视图
信息架构视图是位于INFORMATION_SCHEMA架构内的一组视图,它们以一种标准化的方式来提供元数据信息。也就是说,这些视图是基于ANSI SQL标准而定义的,因此它们自然不会包含SQL Server特有的元数据。
例如,以下对INFORMATION_SCHEMA.TABLES视图的查询可以列出当前数据库中的用户表,以及它们的架构名称:
1 SELECT TABLE_SCHEMA,TABLE_NAME
2 FROM INFORMATION_SCHEMA.TABLES
3 WHERE TABLE_TYPE = N ' BASE TABLE ' ;
以下对INFORMATION_SCHEMA.COLUMNS视图的查询提供了有关Sales.Orders表中各个列的绝大多数的可用信息:
1 SELECT COLUMN_NAME,DATA_TYPE,CHARACTER_MAXIMUM_LENGTH,COLLATION_NAME,IS_NULLABLE
2 FROM INFORMATION_SCHEMA.COLUMNS
3 WHERE TABLE_SCHEMA = N ' Sales ' AND TABLE_NAME = N ' Orders ' ;
系统存储过程
系统存储过程和函数是在其内部查询系统目录,并返回更加“摘要化”的元数据信息。你可以在SQL Server联机丛书中找到有关元数据存储过程和函数对象的完整列表,以及对它们很详细的描述,所以此处只列举几个例子作为演示。sp_tables存储过程返回可以在当前数据库中查询的对象(比如表和视图)列表:
1 EXEC sys.sp_tables;
注意:sys架构是在SQL Server 2005中引入的。在之前的版本中,系统存储过程位于dbo架构内。
sp_help存储过程接受一个对象名称作为输入,返回与之相关的多个结果集,包含了有关对象的一般信息,以及关于列、索引、约束等对象的信息。作为例子,以下代码返回关于Orders表的详细信息:
1 EXEC sys.sp_help @objname = N ' Sales.Orders ' ;
sp_helpconstraint存储过程返回对象中关于约束的信息。例如,以下代码返回Orders表中关于约束的信息:
1 EXEC sys.sp_helpconstraint @objname = N ' Sales.Orders ' ;
还有一组函数可以返回关于数据库实体(如SQL Server实例、数据库、对象、列,等等)的个属性的信息。SERVERPROPERTY函数返回当前数据库实例的指定属性信息。例如,以下代码返回当前数据库实例的版本级别(如RTM、SP1、SP2等):
1 SELECT SERVERPROPERTY( ' ProductLevel ' );
DATABASEPROPERTYEX函数返回指定数据库的特定属性的信息。例如,以下代码返回TSQLFundamentals2008数据库的排序规则的当前设置:
1 SELECT DATABASEPROPERTYEX(N ' TSQLFundamentals2008 ' , ' Collation ' );
OBJECTPROPERTY函数返回指定对象的特定属性的信息。例如,以下代码的输出可以表明Orders表是否具有主键:
1 SELECT OBJECTPROPERTY ( OBJECT_ID (N ' Sales.Orders ' ), ' TableHasPrimarykey ' );
注意在OBJECTPROPERTY中嵌入的OBJECT_ID函数。OBJECTPROPERTY函数可以接受的输入是一个对象的ID,而不是名称,所以要先用OBJECT_ID函数取回Orders表的ID。
COLUMNPROPERTY函数返回指定列上的特定属性的信息。例如,以下代码的输出可以表明Orders表中的shipcountry列是否可以为NULL:
1 SELECT COLUMNPROPERTY ( OBJECT_ID (N ' Sales.Orders ' ),N ' shipcountry ' , ' AllowsNull ' );