查询元数据

  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 WHEREobject_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');

原文地址:https://www.cnblogs.com/ShaYeBlog/p/2701611.html