nin*_*ded 13 t-sql ddl conditional sybase-ase
好的,所以Sybase(12.5.4)将允许我执行以下操作以DROP表(如果它已经存在):
IF EXISTS (
SELECT 1
FROM sysobjects
WHERE name = 'a_table'
AND type = 'U'
)
DROP TABLE a_table
GO
Run Code Online (Sandbox Code Playgroud)
但是,如果我尝试对表创建执行相同操作,我总是会收到警告,表已经存在,因为它继续并尝试创建我的表并忽略条件语句.试试两次运行以下语句,你会明白我的意思:
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
Run Code Online (Sandbox Code Playgroud)
运行以上错误会产生以下错误:
SQL Server错误(localhost)错误:2714 at Line:7消息:数据库中已存在名为"a_table"的对象.
这有什么用??!
nin*_*ded 16
到目前为止,我提出的唯一解决方法是使用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
Run Code Online (Sandbox Code Playgroud)
像魅力一样,感觉就像一个肮脏的黑客.
小智 7
有没有其他方式比打电话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
Run Code Online (Sandbox Code Playgroud)