免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4564 | 回复: 3
打印 上一主题 下一主题

判断表是否存在 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-03-09 19:17 |只看该作者 |倒序浏览
sqlserver中判断表是否存在 收藏

   1. 在sqlserver(应该说在目前所有数据库产品)中创建一个资源如表,视图,存储过程中都要判断与创建的资源是否已经存在
   2. 在sqlserver中一般可通过查询sys.objects系统表来得知结果,不过可以有更方便的方法
   3. 如下:
   4.     if   object_id('tb_table') is not null
   5.         print 'exist'
   6.     else
   7.         print'not exist'
   8. 如上,可用object_id()来快速达到相同的目的,tb_table就是我将要创建的资源的名称,所以要先判断当前数据库中不存在相同的资源
   9. object_id()可接受两个参数,第一个如上所示,代表资源的名称,上面的就是表的名字,但往往我们要说明我们所要创建的是什么类型的资源,
  10. 这样sql可以明确地在一种类型的资源中查找是否有重复的名字,如下:
  11.     if   object_id('tb_table','u') is not null
  12.         print 'exist'
  13.     else
  14.         print'not exist'
  15.
  16. 第二个参数 "u" 就表示tb_table是用户创建的表,即:USER_TABLE地首字母简写
  17. 查询sys.objects中可得到各种资源的类型名称(TYPE列),这里之举几个主要的例子
  18. u  -----------  用户创建的表,区别于系统表(USER_TABLE)
  19. s  -----------  系统表(SYSTEM_TABLE)
  20. v  -----------  视图(VIEW)
  21. p  -----------  存储过程(SQL_STORED_PROCEDURE)
  22. 可使用select distinct type ,type_desc from sys.objects 获得全部信息

论坛徽章:
0
2 [报告]
发表于 2011-03-09 19:19 |只看该作者
现在需要利用批处理调用SQL脚本文件更新数据库,其中有几个表需要增加字段,希望在添加字段的时候先判断该字段是否已经存在,哪位兄弟有做过的?请指教。
尝试过在information_schema获取指定表的信息:
select COLUMN_NAME from information_schema.COLUMNS where TABLE_SCHEMA='database_name' and TABLE_NAME='table_name' and COLUMN_NAME='column_name';
在网上看到有人提到利用WHERE NOT EXISTS(.....),但经过多次尝试都还是不行。。。
ALTER TABLE `tab_phonebook` ADD COLUMN `column_name` int(4) default NULL  
WHERE NOT EXISTS (select COLUMN_NAME from information_schema.COLUMNS where TABLE_SCHEMA='database_name' and TABLE_NAME='table_name' and COLUMN_NAME='column_name';
)
-----------------
悬赏分先随意,十分感谢各位关注我的问题,谢谢!!

最佳答案

Mysql使用Describe命令判断字段是否存在

工作时需要取得MySQL中一个表的字段是否存在 于是就使用Describe命令来判断 mysql_connect('localhost', 'root', 'root'); mysql_select_db('demo'); $test = mysql_query('Describe cdb_posts first'); $test = mysql_fetch_array($test); $test[0]返回的是该字段的名
  

工作时需要取得MySQL中一个表的字段是否存在
于是就使用Describe命令来判断
mysql_connect('localhost', 'root', 'root');
mysql_select_db('demo');
$test = mysql_query('Describe cdb_posts first');
$test = mysql_fetch_array($test);

$test[0]返回的是该字段的名称,比如我要查询first字段,返回的就是first
如果此字段不存在返回的就是NULL,通过这样可以判断一个字段是否存在

附加资料:

describe命令
一、describe命令用于查看特定表的详细设计信息,例如为了查看guestbook表的设计信息,可用:
describe guestbook

二、可通过”show comnus”来查看数据库中表的列名,有两种使用方式:
show columns form 表名 from 数据库名
或者:
show columns from 数据库名.表名

三、用describe命令查询具体列的信息
describe guestbook id
就是查询guestbook中id字段的列信息

{DESCRIBE | DESC} tbl_name [col_name | wild]
DESCRIBE 是 SHOW COLUMNS FROM 的缩写。DESCRIBE 提供有关一个表的列信息。col_name 可以是一个列名或是一个包含 SQL 通配符字符 “%” 和 “_” 的字符串。没有必要用引号包围字符串。

如果列类型不同于你所期望的基于一个 CREATE TABLE 语句建立的列,注意 MySQL 有时会更改列类型。这个语句是提供给与 Oracle 兼容的。

参考资料:http://www.abc188.com/info/html/ ... 20080630/72897.html


MYSQL:如何用sql语句来判断一个表是否存在
2009年03月16日 星期一 15:56
用sql语句来判断一个表是否存在有两种方法。
方法一:
show tables like 'your_table_name';
如果这个表存在,则返回一条记录,如果不存在,返回0行记录。


方法二:
SELECT table_name
FROM information_schema.tables
WHERE table_schema = 'your_database'
AND table_name = 'your_table_name';
这种方法需要知道数据库名称。  字段也一样

论坛徽章:
0
3 [报告]
发表于 2011-03-09 19:22 |只看该作者
本帖最后由 liyihongcug 于 2011-03-09 19:24 编辑

开发了一个档案管理软件 (有30多个单位在用)
现在要对其进行升级打补丁 需要调整SQLserver表中增加一个字段。
问题:我发布了1。0的补丁 里面增加了2个字段a,b
现在要发布1。1版的补丁 还需新增一个字段 c
我想在1。1版的补丁中实现 首先判断是否已打上1。0版的补丁 即是否存在字段a,b 如不存在 就执行增加该两字段的代码 ,存在就跳过
不知各位大大谁知道在SQL Server中如何判断表中是否已存在某字段
只剩70分了 实在不好意思 各位老大帮帮忙把  


来自:SuperSoft, 时间:2004-4-1 8:59:11, ID:2532734
TADOQuery用TFields属性啊
读表判断一下即可  


来自:yf168, 时间:2004-4-1 9:02:23, ID:2532743
看看 syscolumns(各表的所有字段),sysobjects(所有的表) 都在里面呢
通过ID连的,你自己看看 就知道[]  


来自:TYZhang, 时间:2004-4-1 9:02:30, ID:2532744
syscolumns表查看字段
sysobjects表查看用户表,两个配合使用。  


来自:kk2000, 时间:2004-4-1 9:06:43, ID:2532757
if exists(select 1 from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME=@BillType AND COLUMN_NAME='BillNo')
这个应该是你要的!@BillType 指的是表的名称   


来自:gzyhl, 时间:2004-4-1 9:07:58, ID:2532762
用Table1.GetFieldNames(listbox1.Items)将表中字段读入到ListBox1列表中,
再判断是否有你要的字段。  


来自:lixy, 时间:2004-4-1 9:20:10, ID:2532796
写一个例子:
if not exists(select B.name from sysobjects A,syscolumns B
where A.id=B.id  and
      A.type='U' and
      A.name='TableName' and
      B.name='FieldName' )
alter table TableName add FieldName varchar(30) null  


来自:过河卒, 时间:2004-4-1 16:27:45, ID:2533988
利用Sql Server中自带的系统过程sp_column;方法:adoquery1.sql.add('sp_column tablename'),在我们进行数据库编程的时候,可能会遇到这样的情形,需要对某个表或字段是否存在进行判断,这个时候,我们可以打开Management Studio或者企业管理器,在本机->Databases->System Databases->master->Views->System Views找到一系列预制好的视图,此间我们可以找到关于整个Sql Server所有数据库实例的各种有用的信息。其实系统表master本身就是一个关乎维护整个Sql Server系统的数据库。如图:
       所有的试图中,有两个试图分别名叫sys.tables和sys.columns。他们分别是关于系统中所有表和所有字段的试图。要想知道一个表是否存在可以这样写:
IF (SELECT count(*) FROM sys.tables WHERE name = '表1') = 0 ......
其中“表1”为我们想要查找的表名,省略号是之后我们想进行的动作,比如我们可以create table等。判断一个字段是否存在的方法照葫芦画瓢:
IF (SELECT count(*) FROM sys.columns WHERE name = '列1') = 0 ......
要想知道具体某一表下某个字段是否存在可以这样写:
IF (SELECT count(*) FROM sys.columns WHERE object_id =
                                          (SELECT object_id FROM sys.tables WHERE name = '表1')
                and name = '列1') = 0......
其中object_id是每个表在整个Sql Server中的全局ID,上面的SQL语句可以判断在表1下是否有列1这个字段,很简单。
        master数据库在Sql Server中起着很特别的作用,仔细研究一下master这个数据库,我们还可以挖掘出很多别的有用信息,这些信息在我们进行数据库操作时有时特别有用,暂不一一列举。


--判断[TestDB]是否存在
if exists(select 1 from master..sysdatabases where name='TestDB')
    print 'TestDB存在'
else
    print 'TestDB不存在'

--判断表[TestTb]是否存在
if exists(select * from TestDB..syscolumns where id=object_id('TestDB.dbo.TestTb'))
    print '表TestTb存在'
else
    print '表TestTb不存在'

--判断[TestDB]数据中[TestTb]表中是否存在[Name]字段
if exists(select * from TestDB..syscolumns where id=object_id('TestDB.dbo.TestTb') and name
'Name')
    print '字段Name存在'
else
    print '字段Name不存在'

论坛徽章:
0
4 [报告]
发表于 2011-03-11 19:01 |只看该作者
存储过程

if(exists(select * from sysobjects where name='存储过程的名字' and Type='P'))



触发器:

  select * from sysobjects where id=object_id(N'触发器的名字') and objectproperty(id,N'IsTrigger')=1

如果判断用户表格的话,用IsUserTable 代替 上面的IsTrigger



函数

select * from sysobjects where id = object_id(N'[dbo].[USER_Fun]') and (type = 'FN' or type = 'TF'))
--判断是否存在USER_Fun这个用户函数(注意此处的type 有两种,分别是'TF'-Table-valued Function 表值函数 或'FN'-Scalar-valued Function 标量值函数)

特别提醒:如果你觉得这篇文章还算不错,并且在看完之后有所启发,请你顺手做几个简单的事情: 1、写一小段评论,谈一下你自己的想法 2、将此博客,转发给你的QQ上的3位好友。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP