如果存在alter table语句不为null或缺省值不起作用

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

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

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

我想知道为什么nullable列语句可以正确执行!


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


你应该写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
链接地址: http://www.djcxy.com/p/76323.html

上一篇: if exists alter table statement with not null or default value doesn't work

下一篇: NAME function that includes datalength