优内建站网,专业建站,企业建站,免费建站,智能建站,个人建站!
主营企业建站,seo优化,手机网站,微信网站开发等业务!>> 繁体中文
用户名: 密 码: 验证码:    
企业建站,专业建站,模板建站,智能建站
 您现在的位置:首页 >> 服务器及数据库 >> 详细内容>>        【字体:大 中 小】【颜色:红 绿 蓝 黑】

获取SQL Server元数据的几种方法

在百度搜索关于“获取SQL Server元数据的几种方法”的内容

在谷歌搜索关于“获取SQL Server元数据的几种方法”的内容

买空间、服务器就上威客主机网(VK163.COM) 虚拟主机评测+IDC导航=威客主机之家 标志设计
[内容提要] 元数据简介  元数据(metadata)最常见的定义为"有关数据的结构数据",或者再简单一点就是"关于数据的信息",日常生活中的图例、图书馆目录卡和名片等都可以看作是元数据。在关系型数据库管理系统(DBMS)中,元数据描述了数据的结构和意义。比如在管理、维护SQLServ...

作者: 优内科技  来源: 优内科技  驻站日期:2009/8/25 【 加入收藏 】 【 打印此页 】 【 关闭 】

元数据简介

  元数据 (metadata) 最常见的定义为"有关数据的结构数据",或者再简单一点就是"关于数据的信息",日常生活中的图例、图书馆目录卡和名片等都可以看作是元数据。在关系型数据库管理系统 (DBMS) 中,元数据描述了数据的结构和意义。比如在管理、维护 SQL Server 或者是开发数据库应用程序的时候,我们经常要获取一些涉及到数据库架构的信息:

  某个数据库中的表和视图的个数以及名称 ;

  某个表或者视图中列的个数以及每一列的名称、数据类型、长度、精度、描述等;

  某个表上定义的约束;

  某个表上定义的索引以及主键/外键的信息。

  下面我们将介绍几种获取元数据的方法。

  获取元数据

  使用系统存储过程与系统函数访问元数据

  获取元数据最常用的方法是使用 SQL Server 提供的系统存储过程与系统函数。

  系统存储过程与系统函数在系统表和元数据之间提供了一个抽象层,使得我们不用直接查询系统表就能获得当前数据库对象的元数据。

  常用的与元数据有关的系统存储过程有以下一些:

  系统存储过程 描述

  sp_columns 返回指定表或视图的列的详细信息。

  sp_databases 返回当前服务器上的所有数据库的基本信息。

  sp_fkeys 若参数为带有主键的表,则返回包含指向该表的外键的所有表;若参数为带有外键的表名,则返回所有同过主键/外键关系与该外键相关联的所有表。

  sp_pkeys 返回指定表的主键信息。

  sp_server_info 返回当前服务器的各种特性及其对应取值。

  sp_sproc_columns 返回指定存储过程的的输入、输出参数的信息。

  sp_statistics 返回指定的表或索引视图上的所有索引以及统计的信息。

  sp_stored_procedures 返回当前数据库的存储过程列表,包含系统存储过程。

  sp_tables 返回当前数据库的所有表和视图,包含系统表。

常用的与元数据有关的系统函数有以下一些:

  系统函数 描述

  COLUMNPROPERTY 返回有关列或过程参数的信息,如是否允许空值,是否为计算列等。

  COL_LENGTH 返回指定数据库的指定属性值,如是否处于只读模式等。

  DATABASEPROPERTYEX 返回指定数据库的指定选项或属性的当前设置,如数据库的状态、恢复模型等。

  OBJECT_ID 返回指定数据库对象名的标识号

  OBJECT_NAME 返回指定数据库对象标识号的对象名。

  OBJECTPROPERTY 返回指定数据库对象标识号的有关信息,如是否为表,是否为约束等。

  fn_listextendedproperty 返回数据库对象的扩展属性值,如对象描述、格式规则、输入掩码等。

  由于我们无法直接利用到存储过程与函数的返回结果,因此只有在我们关心的只是查询的结果,而不需要进一步利用这些结果的时候,我们会使用系统存储过程与系统函数来查询元数据。

  例如,如果要获得当前服务器上所有数据库的基本信息,我们可以在查询分析器里面运行:


  EXEC sp_databases
  GO

  在返回结果中我们可以看到数据库的名称、大小及备注等信息。

  但是如果要引用这部分信息,或者存储这部分信息以供后面使用,那么我们必须借助中间表来完成这个操作:


  CREATE TABLE #sp_result
  (
  DATABASE_NAME sysname,
  DATABASE_SIZE int,
  REMARKS varchar(254) NULL
  )
  GO
  INSERT INTO #sp_result
  EXEC ('sp_databases')
  GO

使用信息架构视图访问元数据

  信息架构视图基于 SQL-92 标准中针对架构视图的定义,这些视图独立于系统表,提供了关于 SQL Server 元数据的内部视图。信息架构视图的最大优点是,即使我们对系统表进行了重要的修改,应用程序也可以正常地使用这些视图进行访问。因此对于应用程序来说,只要是符合 SQL-92 标准的数据库系统,使用信息架构视图总是可以正常工作的。

  常用的信息架构视图有以下一些:

  信息架构视图 描述

  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 返回当前数据库中的当前用户可以访问的视图及其所有者、定义等信息。

  由于这些信息架构都是以视图的方式存在的,因此我们可以很方便地获得并利用需要的信息。

  例如,我们要得到某个表有多少列,可以使用以下语句:


  SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS
  WHERE TABLE_NAME='mytable'

  使用系统表访问元数据

  虽然使用系统存储过程、系统函数与信息架构视图已经可以为我们提供了相当丰富的元数据信息,但是对于某些特殊的元数据信息,我们仍然需要直接对系统表进行查询。因为SQL Server 将所有数据库对象的信息均存放在系统表中,作为 SQL Server 的管理、开发人员,了解各个系统表的作用将有助于我们了解 SQL Server 的内在工作原理。

  SQL Server 的系统表非常多,其中最常用的与元数据查询有关的表有如下一些:

  系统表 描述

  syscolumns 存储每个表和视图中的每一列的信息以及存储过程中的每个参数的信息。

  syscomments 存储包含每个视图、规则、默认值、触发器、CHECK 约束、DEFAULT 约束和存储过程的原始 SQL 文本语句。

  sysconstraints 存储当前数据库中每一个约束的基本信息。

sysdatabases 存储当前服务器上每一个数据库的基本信息。

  sysindexes 存储当前数据库中的每个索引的信息。

  sysobjects 存储数据库内的每个对象(约束、默认值、日志、规则、存储过程等)的基本信息。

  sysreferences 存储所有包括 FOREIGN KEY 约束的列。

  systypes 存储系统提供的每种数据类型和用户定义数据类型的详细信息。

  将系统存储过程、系统函数、信息架构视图与系统表结合使用,可以方便地让我们获得所有需要的元数据信息。

  示例:

  1、 获得当前数据库所有用户表的名称。


  SELECT OBJECT_NAME (id)
  FROM sysobjects
  WHERE xtype = 'U' AND OBJECTPROPERTY (id, 'IsMSShipped') = 0

  其中主要用到了系统表 sysobjects以及其属性 xtype,还有就是用到了 OBJECTPROPERTY 系统函数来判断是不是安装 SQL Server 的过程中创建的对象。

  2、 获得指定表上所有的索引名称


  SELECT name FROM sysindexes
  WHERE id = OBJECT_ID ('mytable') AND indid > 0

  综合实例

  下面给出了一个存储过程,它的作用是自动将当前数据库的用户存储过程加密。


  DECLARE @sp_name nvarchar(400)
  DECLARE @sp_content nvarchar(2000)
  DECLARE @asbegin int
  declare @now datetime
  select @now = getdate()
  DECLARE sp_cursor CURSOR FOR
  SELECT object_name(id)
  FROM sysobjects
  WHERE xtype = 'P'
  AND type = 'P'
  AND crdate < @now
  AND OBJECTPROPERTY(id, 'IsMSShipped')=0
  OPEN sp_cursor
  FETCH NEXT FROM sp_cursor
  INTO @sp_name
  WHILE @@FETCH_STATUS = 0
  BEGIN
  SELECT @sp_content = text FROM syscomments WHERE id = OBJECT_ID(@sp_name)
  SELECT @asbegin = PATINDEX ( '%AS' + char(13) + '%', @sp_content)
  SELECT @sp_content = SUBSTRING(@sp_content, 1, @asbegin - 1)
  + ' WITH ENCRYPTION AS'
  + SUBSTRING (@sp_content, @asbegin+2, LEN(@sp_content))
  SELECT @sp_name = 'DROP PROCEDURE [' + @sp_name + ']'
  EXEC sp_executesql @sp_name
  EXEC sp_executesql @sp_content
  FETCH NEXT FROM sp_cursor
  INTO @sp_name
  END
  CLOSE sp_cursor
  DEALLOCATE sp_cursor

  该存储过程利用了 sysobjects 和 syscomments 表,并巧妙地修改了原存储过程的 SQL 定义语句,将 AS 修改为了 WITH ENCRYPTION AS,从而达到了加密存储过程的目的。本存储过程在 SQL Server 2000 上通过。

收藏到网摘: 添加到QQ书签 百度收藏 订阅到抓虾 添加到鲜果  新浪ViVi  365Key网摘  天极网摘  我摘  和讯网摘  yahoo  收藏到收客网  Digbuzz我挖网  添加到饭否  挖客  添加到google  

   【回到顶部】 【返回文章列表】 编辑:优内科技
⊕ 上一篇:删除无效的SQL SERVER组的几种方法
⊕ 下一篇:sql server日期时间函数
  相关新闻
返回首页 | 设为首页 | 添加收藏 | 关于我们 | 联系我们 | 企业文化 | 合作伙伴 | 诚聘英才 | 网站报价 | 企业资质 | 网站地图
邮箱登陆 E- mail:master@cck5.com 点击这里给我发消息 客服专员 QQ:310203268 点击这里给我发消息 技术咨询 QQ:22071287点击这里给我发消息 代理备案 QQ:529631515
丰富的网站建设经验,专业提供网站建设、网站制作、网页设计服务,专业设计,真诚服务,不满意不收费!
Copyright 2008 - 2025 cck5 Inc. All Rights Reserved 优内建站网络科技公司
本站部分资源来自网络,如有侵犯您的版权,请告之,我们将即刻删除!QQ:310203268
主要业务:网站建设、企业建站、专业建站、智能建站、SEO优化、微信建站、手机建站
本站ICP备案号:浙ICP备11019299号 中国电信增值ICP经营许可证
不良信息举报中心 江西网警 信息产业部门备案 企业法人营业执照
 
扫优内微信二维码
“码”上有惊喜