当前位置:  开发笔记 > 编程语言 > 正文

如何在Sybase(TSQL)中有条件地创建表?

如何解决《如何在Sybase(TSQL)中有条件地创建表?》经验,为你挑选了2个好方法。

好的,所以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"的对象.

这有什么用??!



1> ninesided..:

到目前为止,我提出的唯一解决方法是使用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

像魅力一样,感觉就像一个肮脏的黑客.


我知道你很久以前就回答了这个问题,但是对于其他人的信息,这正是sybase手册如何说明条件创建需要发生的原因,因为"当在if ... else块或while循环中发生create table命令时,在确定条件是否为真之前,Adaptive Server会为表创建模式.如果表已存在,则可能导致错误.要避免这种情况,请确保数据库中不存在具有相同名称的视图或使用执行声明......"

2> 小智..:

有没有其他方式比打电话create tableexecute("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

推荐阅读
谢谢巷议
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有