如果伺服器主機是在業主的所在位置時,我們在進行更新時,不會直接至伺服器主機進行更新,而是會將需更新的程式(.sql)的寄給業主,再進行更新,但有時我們在進行資料庫更新的執行時,如果要刪除或變更的物件不存在時,就會出現錯誤訊息,那時對業主解釋為何會出現錯誤訊息所花費的時間,比直接到伺服器主機進行更新的所花費的時間還多。

另外一種情況就是業主執行你所寄給他的資料庫更新程式(.sql)時,執行了二次以上,也會出現錯誤訊息,等到業主打電話給你說:「執行後有問題,檢查一下更新程是不是有問題」,你把更新的程式叫出來再三檢視,抓頭皮抓到出血,就是看不出那裡有問題,腦袋裡出現好幾種可能情況,怎麼想都不太可能會發生,所以想一想還是自己走一趟吧,這樣花費的時間又更多了,時間要花在有意義的地方,就算是上Yahoo看看新聞也比去業主的地方更新來的強。

所以現在在進行刪除物件的動作時,我都會加上檢查物件是否存在的語法。

 

這個是刪除主索引鍵

IF EXISTS (SELECT name FROM sysindexes WHERE name = '索引名稱')
    ALTER TABLE 資料表名稱 DROP 索引名稱

這個是刪除索引鍵

IF EXISTS (SELECT name FROM sysindexes WHERE name = '索引名稱')
    DROP INDEX 資料表名稱.索引名稱

 

這是刪除預存程序

IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'[dbo].[預存程序名稱]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
    DROP PROCEDURE [dbo].[預存程序名稱]

這是刪除資料表

IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'[dbo].[資料表名稱]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    DROP TABLE [dbo].[資料表名稱]

這是檢查欄位是否存在

IF EXISTS(SELECT * FROM SysObjects O INNER JOIN SysColumns C ON O.ID=C.ID WHERE ObjectProperty(O.ID,'IsUserTable')=1 AND O.Name='資料表名稱' AND C.Name='欄位名稱')
    ALTER TABLE 資料表名稱 DROP COLUMN 欄位名稱

 

這是檢查預設值是否存在(12/21新增)

IF EXISTS(SELECT * FROM SysObjects WHERE xtype= 'D' AND parent_obj=(SELECT id FROM sysobjects WHERE name= '資料表名稱' and xtype= 'U') AND id IN (SELECT cdefault FROM syscolumns WHERE name= '欄位名稱') AND name = '預設值名稱')
    ALTER TABLE 資料表名稱 DROP CONSTRAINT 預設值名稱

這樣就可以多看幾篇Yahoo新聞了!

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 souts 的頭像
    souts

    記憶所及之處

    souts 發表在 痞客邦 留言(0) 人氣()