SQL Server目录视图教程:对象目录视图

日期: 2011-02-09 作者:Robert Sheldon翻译:冯昀晖 来源:TechTarget中国 英文

接上文:SQL Server目录视图教程:数据库和文件目录视图   下一个SQL Server目录视图的子类型是对象视图。顾名思义,这些视图返回数据库对象的信息。这些视图中最有用的就是“sys.objects”,它可以返回指定数据库中用户定义的,模式范围内的对象。例如,在下面的“SELECT”语句中,我使用“sys.objects”视图来提取“AdventureWorks ”数据库中唯一性约束清单:   USE AdventureWorks2008;   GO   SELECT   a.name AS ObjectName,   (   SELECT b……

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

接上文:SQL Server目录视图教程:数据库和文件目录视图

  下一个SQL Server目录视图的子类型是对象视图。顾名思义,这些视图返回数据库对象的信息。这些视图中最有用的就是“sys.objects”,它可以返回指定数据库中用户定义的,模式范围内的对象。例如,在下面的“SELECT”语句中,我使用“sys.objects”视图来提取“AdventureWorks ”数据库中唯一性约束清单:

  USE AdventureWorks2008;
  GO
  SELECT
  a.name AS ObjectName,
  (
  SELECT b.name
  FROM sys.objects b
  WHERE b.object_id = a.parent_object_id
  ) AS ParentTable
  FROM
  sys.objects a
  WHERE
  a.type = 'UQ';

  在该“SELECT”语句中,我提取了唯一性约束名称和与这些限制关联的父对象(表)的名称。为了提取该表的名称,我创建了一个子查询,把父对象ID与常规对象ID进行了关联。(父对象和子对象都能在“sys.objects”视图中查到。)

  我还在该语句中加上了“WHERE”从句,只返回那些值类型是“UQ”的行。“UQ”代码代表的是唯一性约束(unique constraint)。正如下面的结果所示,“AdventureWorks 2008”数据库只包含唯一性约束,是在document表中定义的。

ObjectName

ParentTable

UQ__Document__F73921F730F848ED

Document

  在对象子类别中另一个有用的视图是“sys.tables”,它返回数据库中配置的用户定义的表清单。下面的“SELECT”语句使用该视图在“AdventureWorks 2008”数据库对象“HumanResources ”中提取表清单:

  USE AdventureWorks2008;
  GO
  SELECT
  name AS TableName,
  is_replicated AS IsReplicated,
  is_tracked_by_cdc AS IsTracked
  FROM
  sys.tables
  WHERE
  schema_id IN
  (
  SELECT schema_id
  FROM sys.schemas
  WHERE name = 'HumanResources'
  );

  如你所见,我提取了表名称,以及它们是被Change Data Capture跟踪的还是复制的。请注意,为了限制只查询“”对象,我在“WHERE”从句中包含了一个子查询,基于对象名称提取对象ID。下表展示了通过“sys.tables ”视图查询出来的结果:

TableName

IsReplicated

IsTracked

Department

0

0

Employee

0

0

EmployeeDepartmentHistory

0

0

EmployeePayHistory

0

0

JobCandidate

0

0

Shift

0

0

  正如结果所示,在“HumanResources ”对象中有六个表。“is_replicated”和“is_tracked_by_cdc”列都被配置为bit列,其中“0”表示false,“1”表示true。表中数据全为“0”意味着没有一个表是被 Change Data Capture复制的或者跟踪的。

  下面这个例子与上面的类似,只是我使用了“sys.procedures”视图来提取“HumanResources ”对象中包含的存储过程清单:

  USEAdventureWorks2008;
  GO
  SELECT
  name AS ProcName,
  type AS ProcType,
  type_desc AS ProcDescript
  FROM
  sys.procedures
  WHERE
  schema_id IN
  (
  SELECT schema_id
  FROM sys.schemas
  WHERE name = 'HumanResources'
  );

  在本例中,我提取了存储过程的名称和类型(包括存储过程代码和描述)。与前面一样,我在“WHERE”从句中使用了子查询来限制只获取指定对象的数据。该“SELECT”语句返回结果如下表:

ProcName

ProcType

ProcDescript

uspUpdateEmployeeHireInfo

P

SQL_STORED_PROCEDURE

uspUpdateEmployeeLogin

P

SQL_STORED_PROCEDURE

uspUpdateEmployeePersonalInfo

P

SQL_STORED_PROCEDURE

  如你所见,结果只包含SQL存储过程。然而,“sys.procedures”视图还将返回“公共语言运行时”存储过程,外部存储过程,以及复制过滤器存储过程,如果数据库中有的话。

  如果你想提取表或视图中关于列的信息,请使用“sys.columns”视图。在下面的例子中,我提取了“AdventureWorks 2008”数据库中名称包含“history”(模糊匹配)的所有对象,表和列的名称:

  USEAdventureWorks2008;
  GO
  SELECT
  s.name AS SchemaName,
  o.name AS ViewName,
  c.name AS ColumnName
  FROM
  sys.columns c
  INNER JOIN sys.objects o
  ON c.object_id = o.object_id
  INNER JOIN sys.schemas s
  ON o.schema_id = s.schema_id
  WHERE
  o.type = 'V' AND
  o.name LIKE '%history%'
  ORDER BY
  s.name, o.name, c.name;

  为了提取视图和对象的名称,我对“sys.columns”视图和“sys.schemas”视图做了联合查询。然后,我使用“WHERE”从句限制查询类型V的对象(视图views)要求对象名称中包含“history”。从执行结果来看,“AdventureWorks 2008”数据库只包含一个带有“history”字样的视图,如下面结果所示:

SchemaName

ViewName

ColumnName

HumanResources

vEmployeeDepartmentHistory

BusinessEntityID

HumanResources

vEmployeeDepartmentHistory

Department

HumanResources

vEmployeeDepartmentHistory

EndDate

HumanResources

vEmployeeDepartmentHistory

FirstName

HumanResources

vEmployeeDepartmentHistory

GroupName

HumanResources

vEmployeeDepartmentHistory

LastName

HumanResources

vEmployeeDepartmentHistory

MiddleName

HumanResources

vEmployeeDepartmentHistory

Shift

HumanResources

vEmployeeDepartmentHistory

StartDate

HumanResources

vEmployeeDepartmentHistory

Suffix

HumanResources

vEmployeeDepartmentHistory

Title

  SQL Server还提供了一个目录视图,允许你查看数据库中配置的索引。例如,在下面的“SELECT”语句中,我使用“sys.indexes”视图提取“AdventureWorks 2008”数据库“Person”表中定义的所有索引信息:

  USEAdventureWorks2008;
  GO
  SELECT
  name AS IndexName,
  type_desc AS IndexType,
  is_primary_key AS PrimaryKey,
  is_unique AS UniqueIndex
  FROM
  sys.indexes
  WHERE
  object_id IN
  (
  SELECT object_id
  FROM sys.objects
  WHERE name = 'person'
  );

  在本例中,我提取了“Person”表每个索引的名称和类型,以及该索引是主键索引还是唯一索引的信息。为了限制只查询“Person”表的数据,我在“WHERE”从句中使用了子查询来提取与“Person”表关联的对象ID。下面的结果展示了该表定义的索引:

IndexName

IndexType

PrimaryKey

UniqueIndex

PK_Person_BusinessEntityID

CLUSTERED

1

1

IX_Person_LastName_FirstName_MiddleName

NONCLUSTERED

0

0

AK_Person_rowguid

NONCLUSTERED

0

1

PXML_Person_AddContact

XML

0

0

PXML_Person_Demographics

XML

0

0

XMLPATH_Person_Demographics

XML

0

0

XMLPROPERTY_Person_Demographics

XML

0

0

XMLVALUE_Person_Demographics

XML

0

0

  我在这里展示的例子只是SQL Server所提供对象目录视图中的一部分。还有与对象视图相关的装配模块,计算列,时间,识别列,触发器,同义词以及其他对象类型。要获取所有对象视图的清单,请参看SQL Server联机丛书相关主题“对象目录视图(Transact-SQL)”。

作者

Robert Sheldon
Robert Sheldon

自由技术撰稿人和技术咨询专家,曾出版和发布若干本书籍、文章和培训教材,重点关注Windows、数据库、商务智能等。

相关推荐