注册 | 登录 忘记密码? 51cto首页 | 博客 | 论坛 | 招聘
热点文章 IB客座主编(四)美国西蒙公..
 帮助

如何获得数据库里所有表的名字


2007-08-06 00:00:00
 标签:数据库   [推送到技术圈]

版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://liutiemeng.blog.51cto.com/120361/37097
如何获得数据库里所有表的名字
平时我们操作比较多的都是表里的数据,也许突然有一天会需要把所有表的名字都列出来看一看——比如,你的论坛是按每个版块一个表来管理的,这时候你要在首页列出各版块的名字。应该怎么办呢?
肯定得用SELECT吧……但我们平时使用SELECT操作的数据都是表里的数据,表的名字并不是表的数据,这可怎么办呢?
你可能会想:“功能强大的SQL Server不会连这么简单的功能都实现不了吧?一定会把所有表的名字存储在某个表里……”注意啦!在这儿我要小小地偷换一下概念了——视图(View)也算是一种“表”,只不过它是由固定查询形成的一种“虚拟表”。
OK,你猜对啦!由SQL Server管理的每个数据库里都有一个名为sysobjects的视图,它是system级别的,所以它的全限定名是——sys.sysobjects
你可能又会问:“为什么不是sys.tables而是sys.objects呢?”问的好!因为这张表里存储的可不光是数据库里的表,它存储的是一个数据库中所有的“对象”——杂七杂八包括了表的主键、存储过程、触发器等等,一共是24种——表(Table,确切地说是“用户自定义表”)只是这24种对象中的一种。
剩下的事情……吼吼……
执行下面的查询语句,可以得到所有包含在sys.sysobjects视图里的数据
USE AdventureWorks
SELECT *
FROM sys.sysobjects
GO
得出数据后,请注意名为type的列——这一列标明了对象的类型,也就是前面提到的24种。在这里,我用一个表格把它们列出来:
AF = Aggregate function (CLR)
C = CHECK constraint
D = DEFAULT (constraint or stand-alone)
F = FOREIGN KEY constraint
FN = SQL scalar function
FS = Assembly (CLR) scalar function
FT = Assembly (CLR) table-valued function
IF = SQL inline table-valued function
IT = Internal table
P = SQL stored procedure
PC = Assembly (CLR) stored procedure
PK = PRIMARY KEY constraint
R = Rule (old-style, stand-alone)
RF = Replication-filter-procedure
S = System base table
SN = Synonym
SQ = Service queue
TA = Assembly (CLR) DML trigger
TF = SQL table-valued-function
TR = SQL DML trigger
U = Table (user-defined)
UQ = UNIQUE constraint
V = View
X = Extended stored procedure
OK,我们要得到名称的表(用户自定义表)就是类型为“U”的对象;而sys.objects的类型为“S”。所以,为了达到我们的最终目的,SQL语句应该是——
USE AdventureWorks
SELECT name
FROM sys.sysobjects
WHERE type='U'
GO
 
 下面我再给出一段用C#实现的代码:
  
//========<水之真谛>========//
//====<
以人为本,关注民生>====//
//   http://blog.csdn.net/FantasiaX   //
using System;
using System.Data.SqlClient;

namespace SqlSample
{
         class Program
         {
                   static void Main(string[] args)
                   {
                            string connectionString = @"Server=(local); Database=AdventureWorks; User ID=sa; Password=password";
                            SqlConnection connection = new SqlConnection();
                            connection.ConnectionString = connectionString;

                            string sqlCommandString = @"USE AdventureWorks SELECT name FROM sys.sysobjects WHERE type='U' ORDER BY name";
                            SqlCommand command = new SqlCommand();
                            command.CommandType = System.Data.CommandType.Text;
                            command.CommandText = sqlCommandString;
                            command.Connection = connection;
                            connection.Open();

                            SqlDataReader reader = command.ExecuteReader();
                            while (reader.Read())
                            {
                                     Console.WriteLine(reader[@"name"]);
                            }
                   }
         }
}

运行后得到的截图是:
  
嗯~~~小问题也要认真对待~~~细节体现品质。我要把这个问题加到面试题里去,呵呵~~~

本文出自 “上善若水 润物无声” 博客,请务必保留此出处http://liutiemeng.blog.51cto.com/120361/37097





    文章评论
 
2007-08-06 22:12:27
好强啊
它存储的是一个数据库中所有的“对象”——杂七杂八包括了表的主键、存储过程、触发器等等
有这么多的东东

2007-08-07 12:27:49
经典``看了回贴是美德

2007-08-24 13:09:51
这也面试。。。

2007-08-29 12:45:44
有没有那个师付带带我搞网络,还黑软技术啊.

2007-08-31 08:42:30
我使用的SQL Server2000中,sysobjects是一张系统表,而不是视图,其所有者默认值是dbo,而不是sys。

2007-09-14 19:26:06
呵呵,看了你好几篇文章,发现你文笔很不错啊,每篇读完就有一个感想,感觉到你是一个很有耐心的人,文章都很通俗易懂详细透彻.很正规.呵呵.

 

发表评论

昵   称:
验证码:  点击图片可刷新验证码  博客过2级,无需填写验证码
内   容: