如果存在alter table语句不为null或缺省值不起作用
我尝试添加一个新列column2到test_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