C#遍历SQL服务器上的存储过程和表

href="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/02/clip_filelist.xml" rel="File-List" />

平时我们操作比较多的都是表里的数据,也许突然有一天会需要把所有表的名字都列出来看一看——比如,你的论坛是按每个版块一个表来管理的,这时候你要在首页列出各版块的名字。应该怎么办呢?

肯定得用SELECT……但我们平时使用SELECT操作的数据都是表里的数据,表的名字并不是表的数据,这可怎么办呢?

你可能会想:功能强大的SQL Server不会连这么简单的功能都实现不了吧?一定会把所有表的名字存储在某个表里……”注意啦!在这儿我要小小地偷换一下概念了——视图(View)也算是一种,只不过它是由固定查询形成的一种虚拟表

OK,你猜对啦!由SQL Server管理的每个数据库里都有一个名为sysobjects的视图,它是system级别的,所以它的全限定名是——sys.sysobjects

你可能又会问:为什么不是sys.tables而是sys.objects呢?问的好!因为这张表里存储的可不光是数据库里的表,它存储的是一个数据库中所有的对象”——杂七杂八包括了表的主键、存储过程、触发器等等,一共是24——表(Table,确切地说是用户自定义表)只是这24种对象中的一种。

剩下的事情……

执行下面的查询语句,可以得到所有包含在sys.sysobjects视图里的数据
href="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/02/clip_filelist.xml" rel="File-List" /> href="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/02/clip_editdata.mso" rel="Edit-Time-Data" />USE AdventureWorks

SELECT * FROM sys.sysobjects
GO
href="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/02/clip_filelist.xml" rel="File-List" />

得出数据后,请注意名为type的列——这一列标明了对象的类型,也就是前面提到的24种。在这里,我用一个表格把它们列出来:

href="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/04/clip_filelist.xml" rel="File-List" />

 

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

href="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/07/clip_filelist.xml" rel="File-List" /> href="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/07/clip_editdata.mso" rel="Edit-Time-Data" />


PS: SELECT name FROM sys.sysobjects WHERE type='U' 查询的结果中除了用户自定义的表之外,还有一个dtproperties表,为了得到确切的用户自定义表的列表,需要在查询条件中添加一个条件,即name<>'dtproperties'。即:"select name from sysobjects where type='U'and name<>'dtproperties'"

另外的方法:

SQL2005遍历SQL数据库上表名

strcmd = "select name from sysobjects where objectproperty(id, N'IsUserTable')=1";

 

SQL2005遍历SQL数据库上存储过程名

strcmd = "select name from sysobjects where objectproperty(id, N'IsProcedure')=1";





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章