代码改变世界

数据查询表,列名对比

2010-01-19 09:28  潇湘隐者  阅读(1229)  评论(0编辑  收藏  举报

    在数据库里创建、删除表时,往往需要判断这个表是否存在; 有时候在修改表字段,比如添加、删除字段时也需要事先判断该字段是否存在,这往往有对应的脚本或操作,不同的数据库有不同的相关的对象、脚本。下面我们拿Access 2003 , SQL Server 2005 , Oracle 10i来分析对比一下吧。

一:在SQL Server 2005 里查询某个表是否存在以及查询某个表有哪些字段的的脚本如下所示:

Code Snippet
  1. SELECT * FROM dbo.SYSOBJECTS WHERE XTYPE ='U' AND NAME ='TableName';
  2.  
  3.  
  4. SELECT * FROM SYSCOLUMNS WHERE ID = OBJECT_ID(N'TableName');

       

1.1 查询当前数据库是否存在用户表Users,其中U表示用户表,你也可以在SYSOBJECTS 查询存储过程、触发器等

详细参数如下:

C = CHECK 约束

D = 默认设置或DEFAULT 约束

F = FOREIGN KEY 约束

L = 日志

FN = 标量函数

IF = 内联表函数

P = 存储过程

PK = PRIMARY KEY 约束(类型为 K)

RF = 复制筛选器存储过程

S = 系统表

TF = 表函数

TR = 触发器

U = 用户表

UQ = UNIQUE 约束(类型为 K)

V = 视图

X = 扩展存储过程

例子:

SELECT * FROM dbo.SYSOBJECTS WHERE XTYPE ='U' AND NAME ='Users'  

1.2  查询表Users存在哪些字段

SELECT * FROM SYSCOLUMNS WHERE ID = OBJECT_ID(N'Users')

 

二:在Access 里面查询某个表是否存在的脚本如下所示:

Code Snippet
  1. SELECT*
  2.   FROMMsysObjects
  3.  WHEREParentId = ( SELECT o.ID
  4.                    FROM   MsysObjects o
  5.                    WHERE  NAME = 'Tables'
  6.                  )
  7.       AND NAME = 'Student'

这是查询是否存在一个Student表在当前数据库 ,其实MsysObjects是一个系统表,可能很多人会问这个表在那里,其实要看到这个表的话,选择工具—》选项 —》视图 后选中系统对象后,你就可以在表里面看到这个表了

                            

 

 

当然Access里面没有保存表字段的系统表,如果你想取得某个表的所有字段,你可以用如下的代码来获取

Code
  1. private string[,] GetTableColumn(string tableName)
  2. {
  3.         string connectionString = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=H:\\Code Resouse\\db1.mdb";
  4.  
  5.         OleDbConnection connection = new OleDbConnection(connectionString);
  6.  
  7.         OleDbCommand cmd = new OleDbCommand();
  8.         cmd.CommandText = "SELECT * FROM " + tableName + " WHERE 1 <> 1";
  9.         cmd.Connection = connection;
  10.  
  11.         connection.Open();
  12.  
  13.         OleDbDataAdapter dataAdapter = new OleDbDataAdapter(cmd);
  14.  
  15.         DataTable dtSchema = new DataTable();
  16.         dataAdapter.Fill(dtSchema);
  17.         connection.Close();
  18.  
  19.         String[,] DataColumns = new string[dtSchema.Columns.Count, 2];
  20.         for (int index = 0; index < dtSchema.Columns.Count; index++)
  21.         {
  22.             DataColumns[index, 0] = dtSchema.Columns[index].ColumnName;
  23.             DataColumns[index, 1] = dtSchema.Columns[index].DataType.FullName;
  24.  
  25.         }
  26.         return DataColumns;
  27.     }

三: 在Oracle里面你可以从DBA_ALL_TABLES  、ALL_ALL_TABLES  、USER_ALL_TABLES  、ALL_TABLES

等这几个表查找是否存在某个用户表。

存储数据库表的系统表视图主要有:  

   
  DBA_ALL_TABLES  
   
  描述数据库中所有的对象以及相关的表。  
   
  ALL_ALL_TABLES  
   
  描述数据库中所有的用户可以访问的对象以及相关的表。  
   
  USER_ALL_TABLES  
   
  描述数据库中当前用户拥有的对象以及相关的表。  
   
   
  DBA_TABLES  
   
  描述数据库中所有相关的表。  
   
  ALL_TABLES  
   
  描述数据库中所有的用户可以访问的相关的表。  
   
  USER_TABLES  
   

  描述数据库中当前用户拥有的相关的表。

SQL Code
  1. SELECT * FROM ALL_TABLES WHERE TABLE_NAME ='Users'
  2.  
  3. SELECT * FROM ALL_TAB_COLS WHERE TABLE_NAME = 'Users'
  4.  
  5. SELECT * FROM ALL_TAB_COLUMNS WHERE TABLE_NAME = 'Users'

 

存储数据库表的列属性的系统表/视图主要有:
DBA_TAB_COLUMNS
描述数据库中所有的表的列属性。
ALL_TAB_COLUMNS
描述数据库中所有的用户可以访问的表的列属性。
USER_TAB_COLUMNS
描述数据库中当前用户拥有的表的列属性。
ALL_TAB_COLS
描述数据库中所有的用户可以访问的表的列属性。