1. 在sqlserver(應(yīng)該說在目前所有數(shù)據(jù)庫產(chǎn)品)中創(chuàng)建一個(gè)資源如表,視圖,存儲(chǔ)過程中都要判斷與創(chuàng)建的資源是否已經(jīng)存在
2. 在sqlserver中一般可通過查詢sys.objects系統(tǒng)表來得知結(jié)果,不過可以有更方便的方法
3. 如下:
4. if object_id('tb_table') is not null
5. print 'exist'
6. else
7. print'not exist'
8. 如上,可用object_id()來快速達(dá)到相同的目的,tb_table就是我將要?jiǎng)?chuàng)建的資源的名稱,所以要先判斷當(dāng)前數(shù)據(jù)庫中不存在相同的資源
9. object_id()可接受兩個(gè)參數(shù),第一個(gè)如上所示,代表資源的名稱,上面的就是表的名字,但往往我們要說明我們所要?jiǎng)?chuàng)建的是什么類型的資源,
10. 這樣sql可以明確地在一種類型的資源中查找是否有重復(fù)的名字,如下:
11. if object_id('tb_table','u') is not null
12. print 'exist'
13. else
14. print'not exist'
15.
16. 第二個(gè)參數(shù) "u" 就表示tb_table是用戶創(chuàng)建的表,即:USER_TABLE地首字母簡寫
17. 查詢sys.objects中可得到各種資源的類型名稱(TYPE列),這里之舉幾個(gè)主要的例子
18. u ----------- 用戶創(chuàng)建的表,區(qū)別于系統(tǒng)表(USER_TABLE)
19. s ----------- 系統(tǒng)表(SYSTEM_TABLE)
20. v ----------- 視圖(VIEW)
21. p ----------- 存儲(chǔ)過程(SQL_STORED_PROCEDURE)
22. 可使用select distinct type ,type_desc from sys.objects 獲得全部信息作者: liyihongcug 時(shí)間: 2011-03-09 19:19
現(xiàn)在需要利用批處理調(diào)用SQL腳本文件更新數(shù)據(jù)庫,其中有幾個(gè)表需要增加字段,希望在添加字段的時(shí)候先判斷該字段是否已經(jīng)存在,哪位兄弟有做過的?請(qǐng)指教。
嘗試過在information_schema獲取指定表的信息:
select COLUMN_NAME from information_schema.COLUMNS where TABLE_SCHEMA='database_name' and TABLE_NAME='table_name' and COLUMN_NAME='column_name';
在網(wǎng)上看到有人提到利用WHERE NOT EXISTS(.....),但經(jīng)過多次嘗試都還是不行。。。
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';
)
-----------------
懸賞分先隨意,十分感謝各位關(guān)注我的問題,謝謝!!
來自:kk2000, 時(shí)間:2004-4-1 9:06:43, ID:2532757
if exists(select 1 from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME=@BillType AND COLUMN_NAME='BillNo')
這個(gè)應(yīng)該是你要的!@BillType 指的是表的名稱
來自:lixy, 時(shí)間:2004-4-1 9:20:10, ID:2532796
寫一個(gè)例子:
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
來自:過河卒, 時(shí)間:2004-4-1 16:27:45, ID:2533988
利用Sql Server中自帶的系統(tǒng)過程sp_column;方法:adoquery1.sql.add('sp_column tablename'),在我們進(jìn)行數(shù)據(jù)庫編程的時(shí)候,可能會(huì)遇到這樣的情形,需要對(duì)某個(gè)表或字段是否存在進(jìn)行判斷,這個(gè)時(shí)候,我們可以打開Management Studio或者企業(yè)管理器,在本機(jī)->Databases->System Databases->master->Views->System Views找到一系列預(yù)制好的視圖,此間我們可以找到關(guān)于整個(gè)Sql Server所有數(shù)據(jù)庫實(shí)例的各種有用的信息。其實(shí)系統(tǒng)表master本身就是一個(gè)關(guān)乎維護(hù)整個(gè)Sql Server系統(tǒng)的數(shù)據(jù)庫。如圖:
所有的試圖中,有兩個(gè)試圖分別名叫sys.tables和sys.columns。他們分別是關(guān)于系統(tǒng)中所有表和所有字段的試圖。要想知道一個(gè)表是否存在可以這樣寫:
IF (SELECT count(*) FROM sys.tables WHERE name = '表1') = 0 ......
其中“表1”為我們想要查找的表名,省略號(hào)是之后我們想進(jìn)行的動(dòng)作,比如我們可以create table等。判斷一個(gè)字段是否存在的方法照葫蘆畫瓢:
IF (SELECT count(*) FROM sys.columns WHERE name = '列1') = 0 ......
要想知道具體某一表下某個(gè)字段是否存在可以這樣寫:
IF (SELECT count(*) FROM sys.columns WHERE object_id =
(SELECT object_id FROM sys.tables WHERE name = '表1')
and name = '列1') = 0......
其中object_id是每個(gè)表在整個(gè)Sql Server中的全局ID,上面的SQL語句可以判斷在表1下是否有列1這個(gè)字段,很簡單。
master數(shù)據(jù)庫在Sql Server中起著很特別的作用,仔細(xì)研究一下master這個(gè)數(shù)據(jù)庫,我們還可以挖掘出很多別的有用信息,這些信息在我們進(jìn)行數(shù)據(jù)庫操作時(shí)有時(shí)特別有用,暫不一一列舉。
--判斷[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]數(shù)據(jù)中[TestTb]表中是否存在[Name]字段
if exists(select * from TestDB..syscolumns where id=object_id('TestDB.dbo.TestTb') and name
'Name')
print '字段Name存在'
else
print '字段Name不存在'作者: liyihongcug 時(shí)間: 2011-03-11 19:01
存儲(chǔ)過程
if(exists(select * from sysobjects where name='存儲(chǔ)過程的名字' and Type='P'))
觸發(fā)器:
select * from sysobjects where id=object_id(N'觸發(fā)器的名字') and objectproperty(id,N'IsTrigger')=1
如果判斷用戶表格的話,用IsUserTable 代替 上面的IsTrigger
函數(shù)
select * from sysobjects where id = object_id(N'[dbo].[USER_Fun]') and (type = 'FN' or type = 'TF'))
--判斷是否存在USER_Fun這個(gè)用戶函數(shù)(注意此處的type 有兩種,分別是'TF'-Table-valued Function 表值函數(shù) 或'FN'-Scalar-valued Function 標(biāo)量值函數(shù))