我尝试在 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为其创建模式 在确定条件是否为真之前的表或视图。这个 如果表或视图已经存在,可能会导致错误。
我想知道为什么可以为空的列语句可以无错误地执行!
答案 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