好的,所以Sybase(12.5.4)将允许我执行以下操作以DROP表(如果它已经存在):
IF EXISTS ( SELECT 1 FROM sysobjects WHERE name = 'a_table' AND type = 'U' ) DROP TABLE a_table GO
但是,如果我尝试对表创建执行相同操作,我总是会收到警告,表已经存在,因为它继续并尝试创建我的表并忽略条件语句.试试两次运行以下语句,你会明白我的意思:
IF NOT EXISTS ( SELECT 1 FROM sysobjects WHERE name = 'a_table' AND type = 'U' ) CREATE TABLE a_table ( col1 int not null, col2 int null ) GO
运行以上错误会产生以下错误:
SQL Server错误(localhost)错误:2714 at Line:7消息:数据库中已存在名为"a_table"的对象.
这有什么用??!
到目前为止,我提出的唯一解决方法是使用execute immediate:
IF NOT EXISTS ( SELECT 1 FROM sysobjects WHERE name = 'a_table' AND type = 'U' ) EXECUTE("CREATE TABLE a_table ( col1 int not null, col2 int null )") GO
像魅力一样,感觉就像一个肮脏的黑客.
有没有其他方式比打电话create table
的execute("create table ...")
SYBASE手册说:
在if ... else块或while循环中发生create table命令时,Adaptive Server会在确定条件是否为true之前为该表创建架构.如果表已存在,这可能会导致错误.要避免这种情况,请确保数据库中不存在具有相同名称的视图或使用execute语句,如下所示:
if not exists (select * from sysobjects where name="my table") begin execute "create table mytable(x int)" end