2009-06-17 88 views
2

我有很多代碼我試圖運行的位置查詢sysobjects表來檢查一個對象是否存在,然後再放下它並重新創建它。爲什麼IF EXISTS不起作用?

問題是,有時如果我去:

if not exists (select name from sysobjects o where o.name = 'my_table' and o.type = 'U') 
CREATE TABLE my_table (..) 
go 

它工作,無後顧之憂。但是,當我再次運行它時,我得到了這個可愛的錯誤:

SQL Server Error on (myserver) Error:2714 at Line:10 Message:There is already an object named 'my_table' in the database. 

感謝那,SQL程序員。我實際上要求你不要創建這個表,如果它已經存在。 -_-

任何想法?

回答

1

你在做什麼的邏輯似乎不太正確。根據您的語句:

「我試圖運行在那裏我查詢sysobjects表,以檢查是否之前我把它存在的對象,然後再次創建」

你應該簡單地做刪除後一個創造。這種方式通常更好,因爲它確保表格將被更新。如果表格存在並且您有更改,您可能沒有得到您想要的。

您正在運行的即時問題是假設數據庫所有權在運行之間不一致。

根據您的澄清如下 - 這裏是你可以做什麼:

IF EXISTS(SELECT * FROM sys.objects中WHERE OBJECT_ID = OBJECT_ID(N '[DBO] [XXXX]')和類型( N'U')) DROP TABLE [DBO]。[XXXX] GO

CREATE TABLE [DBO]。[XXXX(... GO

你可以一遍又一遍運行這個.. 。

+0

我已經嘗試了「請刪除以前的版本,如果你有一個,然後安裝此版本」和「請只安裝此版本,如果你沒有以前的版本「。 我只想要一個腳本,我可以一次又一次運行(用於測試)而不會破壞任何東西(多個系統代碼,嘗試複製約束的系統錯誤等) – glasnt 2009-06-17 07:21:27

0

sybase解析器對象驗證過程是全局的,不基於條件評估。即使你的代碼不能執行CREATE TABLE語句仍然會檢查語法和適用性,當系統發現表已經存在時,語句和適用性將失敗。

我知道的唯一方法就是把你的創建語句放在一個EXEC()中,只有在該段被執行時纔會被評估。

+0

這聽起來是正確的..但我沒有sybase的副本來測試這個 – 2009-06-17 02:05:24

0

是的,整批SQL都是no經過整理和編譯,爲整個批次創建一個「執行計劃」。在規範化期間,如果在編譯時已經存在「可能的」「創建表」語句,那麼它是一個問題。

我的解決辦法: - 如果存在

(選擇1從....) 開始 DROP TABLE XYZ 創建表xyz_zzzz(...) EXEC sp_rename 'xyz_zzzz', '某某' 重命名end

相關問題