Sea*_*hou 4 alter-table sap-ase
我尝试在test_tbl 中添加一个新列column2并将该列设置为默认值'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
Run Code Online (Sandbox Code Playgroud)
错误是
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
Run Code Online (Sandbox Code Playgroud)
但是如果我添加一列可以为空。
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
Run Code Online (Sandbox Code Playgroud)
它可以工作。我对这些很困惑。我搜索了一些标签,知道动态 sql 可以工作。
错误是在规范化期间引发的(因为解析树正在转换为规范化查询树),而不是在执行时。动态 sql 的内容在实际调用之前不会被处理,从而避免了错误。
在 Sybase DOC 中关于 if...else
当在 if...else 块中出现 alter table、create table 或 create view 命令时,Adaptive Server 在确定条件是否为真之前为表或视图创建模式。如果表或视图已经存在,这可能会导致错误。
我想知道为什么可空列语句可以无错误地执行!
我在 Sybase ASE 15 上看到了相同的行为
除了您已经从 Sybase Documentaiton 中引用的内容之外,我无法为您提供解释,但是您可以通过将调用 alter table 包装在 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
Run Code Online (Sandbox Code Playgroud)
我的猜测是服务器能够if...else在执行 alter 语句之前评估此实例中的语句。