14

好的,所以 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”的对象。

这有什么关系?!

4

9 回答 9

20

到目前为止,我想出的唯一解决方法是立即执行:

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

像魅力一样工作,感觉像一个肮脏的黑客。

于 2008-11-21T05:49:55.620 回答
7

除了打电话别无他create tableexecute("create table ...")

SYBASE 手册说:

当 create table 命令出现在 if...else 块或 while 循环中时, Adaptive Server 在确定条件是否为真之前为表创建模式。如果表已经存在,这可能会导致错误。为避免这种情况,请确保数据库中不存在同名视图或使用执行语句,如下所示:

if not exists
    (select * from sysobjects where name="my table")
begin
execute "create table mytable(x int)"
end
于 2009-12-22T16:32:10.967 回答
2

我没有对此进行测试,但您可以尝试将 create table 语句移动到 sproc 中。然后,您可以根据现有的 if 语句有条件地调用该存储过程。

于 2008-11-21T17:18:04.343 回答
1

在 char @variable 中分配“CREATE TABLE”语句,然后执行 EXEC(@variable)。

于 2009-06-12T17:23:15.563 回答
1

如果您想始终创建表,但有条件地删除它,您可以使用:

IF(SELECT count(*) FROM sysobjects WHERE name="tableNameWithoutUserPart") > 0
    DROP TABLE tableNameWithUserPart
GO

CREATE TABLE tableNameWithUserPart ...
于 2011-02-21T15:05:32.383 回答
0

不需要解决方法;)

根据文档:

CREATE [ GLOBAL TEMPORARY ] TABLE [ IF NOT EXISTS ] [ owner.]table-name
( { column-definition | table-constraint | pctfree }, ... )
[ { IN | ON } dbspace-name ]
[ ENCRYPTED ]
[ ON COMMIT { DELETE | PRESERVE } ROWS
   | NOT TRANSACTIONAL ]
[ AT location-string ]
[ SHARE BY ALL ]

只需使用如果不存在。

于 2012-11-02T10:21:24.403 回答
-1
IF object_id('a_table') IS NULL
BEGIN
    CREATE TABLE a_table (
        col1 int not null,
        col2 int null
    ) 
END
于 2008-11-21T05:24:33.970 回答
-1

这在使用Sybase Anywhere 10.01进行测试时有效:

if not exists(select * from SysColumns where tname = 'AAA') then create table DBA.AAA(  UNIQUEID integer not null ) END IF ;
于 2015-01-16T15:36:47.007 回答
-2

尝试使用开始和结束。

IF NOT EXISTS (SELECT Count(1) FROM sysobjects WHERE name = 'a_table' AND type = 'U') BEGIN CREATE TABLE a_table ( col1 int not null, col2 int null ) END GO

于 2008-12-01T17:20:39.313 回答