如果存在,alter table语句不为null或默认值不起作用

时间:2012-07-06 06:52:20

标签: sybase-ase alter-table

我尝试在 test_tbl 中添加一个新列 column2 ,并将列设置为默认值 'N / A' 不为空 。声明如下:

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中关于if ... else

  

发生alter table,create table或create view命令时   在if ... else块中,Adaptive Server为其创建模式   在确定条件是否为真之前的表或视图。这个   如果表或视图已经存在,可能会导致错误。

我想知道为什么可以为空的列语句可以无错误地执行!

3 个答案:

答案 0 :(得分:4)

我在Sybase ASE 15上看到了相同的行为

除了您从Sybase Documentaiton引用的内容之外,我无法向您提供解释,但是您可以通过在execute()语句中包含对alter table的调用来编写一致的行为,如下所示

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语句。

答案 1 :(得分: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

答案 2 :(得分:0)

布拉德的答案不适用于我这个版本:

Adaptive Server Enterprise / 16.0 SP03 PL05 / EBF 28236 SMP / P / AMD64 / Windows 2008 R2 SP1 / ase160sp03pl05x / 0/64位/ FBO / Mon Jul 30 02:37:39 2018

(我认为如果该列过去曾经存在于表中,则返回1)

此代码有效:

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