2012-07-06 68 views
2

我嘗試添加一個新列列2到test_tbl並設置默認值的列「N/A」非空。該聲明如下:如果存在alter table語句有沒有空或默認值不起作用

if not exists (select 1 from syscolumns where object_name(id) = 'test_tbl' and name = 'column2') 
begin 
    alter table test_tbl add column2 varchar(20) default 'N/A' not null 
end 

的錯誤是

Could not execute statement. 
Column names in each table must be unique. Column name 'column2' in table 'test_tbl' is specified more than once. 
Sybase error code=2705 
Severity Level=16, State=3, Transaction State=1 
Line 4 

但是,如果我添加一列是可空

if not exists (select 1 from syscolumns where object_name(id) = 'test_tbl' and name = 'column2') 
begin 
    alter table test_tbl add column2 varchar(20) null 
end 

它可以工作。我對這些很滿意。 我搜索了一些標籤,並知道動態SQL可以工作。

誤差歸一化過程中被升高(如分析樹是 被轉換成歸一化的查詢樹),而不是在執行 。動態sql的內容只有在實際調用 之後纔會被處理,從而避免了錯誤。

在Sybase DOC大約如果...否則

當ALTER TABLE,創建表,或創建視圖命令發生if ... else塊內 ,Adaptive Server創建作爲模式 表或視圖在確定條件是否爲真之前。如果表或視圖已存在,則此 可能會導致錯誤。

我想知道爲什麼可以運行nullable column語句而沒有錯誤!

回答

4

我看到的Sybase ASE相同的行爲15

我不能爲您提供超乎你已經從Sybase載文引述的解釋,但是你可以通過腳本包調用一致的行爲改變表中一個execute()語句如下

if not exists (select 1 from syscolumns where object_name(id) = 'tbl_test' and name = 'column2') 
begin  
    execute(" 
     alter table tbl_test add column2 varchar(20) default 'N/A' not null 
    ") 
end 

我的猜測是,服務器能夠執行ALTER語句之前評估在這種情況下,if...else聲明。

0

你應該寫go..

請檢查下面的代碼它的工作對我罰款

IF EXISTS (SELECT 1 FROM sysobjects WHERE name = 'a_table' AND type = 'U') 
drop table a_table 
go 
CREATE TABLE a_table (col1 int not null,col2 int null) 
go