2008-11-21 8 views
11

ОК, так что Sybase (12.5.4) позволит мне сделать следующее DROP таблицу, если она уже существует:Как условно создать таблицу в Sybase (TSQL)?

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 Error on (localhost) Error:2714 at Line:7 Message:There is already an object named 'a_table' in the database.

В чем дело с этим ?!

+0

Что с ответами на downvoting? А потом наградить себя принятием? За не-ответ? – dkretz 2009-02-01 03:21:59

+0

Я подал ответные ответы, которые не помогают ответить на вопрос, это цель downvoting. Я поддержал ответы, которые помогли и были жизнеспособными, но в итоге единственным решением, которое сработало для меня, было мое собственное. Я не получаю репутацию для ответа на свой собственный вопрос, так что это не для меня. – ninesided 2009-02-01 10:24:23

+0

Достаточно честный. Я запомню, что не отвечу, если не буду уверен, что ваш вопрос будет рассмотрен моим ответом. В этом случае информации было недостаточно, поэтому я тратил впустую свое время. – dkretz 2009-02-01 22:57:02

ответ

12

Единственный способ решения проблемы я придумал до сих пор является использование выполнить немедленно:

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 

работает как шарм, чувствует, как грязный хак.

+4

Я знаю, что вы давно это ответили, но для информации о других людях это точно так, как говорится в руководстве sybase о условном создании, потому что «Когда команда create table возникает в блоке if ... else или while , Adaptive Server создает схему для таблицы, прежде чем определять, является ли условие истинным. Это может привести к ошибкам, если таблица уже существует. Чтобы избежать этой ситуации, убедитесь, что представление с тем же именем еще не существует в базе данных или используйте инструкцию execute ... » – scrappedcola 2011-04-20 20:13:47

-2
IF object_id('a_table') IS NULL 
BEGIN 
    CREATE TABLE a_table (
     col1 int not null, 
     col2 int null 
    ) 
END 
+0

Нет, это тоже не получается. Такая же ошибка. – ninesided 2008-11-21 05:47:03

2

Я не тестировал это, но вы можете попробовать переместить инструкцию create table в sproc. Тогда вы можете условно называть это sproc на основе существующего оператора if.

-2

Попробуйте использовать начало и конец.

IF NOT EXISTS ( SELECT COUNT (1) ОТ sysobjects ГДЕ имя = 'a_table' И тип = 'U' ) НАЧАТЬ CREATE TABLE a_table ( col1 Int не нулевой, col2 ИНТ нуль ) END GO

1

Присвоить "CREATE TABLE" заявление в полукокса @variable, а затем сделать EXEC (@variable).

7

Там нет другого пути, кроме вызова create table в execute("create table ...")

Руководство по SYBASE говорит:

When a create table command occurs within an if...else block or a while loop, Adaptive Server creates the schema for the table before determining whether the condition is true. This may lead to errors if the table already exists. To avoid this situation, either make sure a view with the same name does not already exist in the database or use an execute statement, as follows:

if not exists 
    (select * from sysobjects where name="my table") 
begin 
execute "create table mytable(x int)" 
end 
0

Если вы хотите, чтобы всегда создать таблицу, но условно уронить его, вы можете использовать:

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

CREATE TABLE tableNameWithUserPart ... 
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 ] 

Просто используйте IF NOT EXISTS.

-1

Это работает при тестировании с Sybase в любом месте 10.01:

if not exists(select * from SysColumns where tname = 'AAA') then create table DBA.AAA( UNIQUEID integer not null) END IF ;