Вопрос

Хорошо, поэтому Sybase (12.5.4) позволит мне сделать следующее, чтобы УБРАТЬ таблицу, если она уже существует:

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 на (локальный хост)   Ошибка: 2714 в строке: 7 Сообщение: есть   уже объект с именем "a_table" в   база данных.

Что за дела с этим?!

Это было полезно?

Решение

Единственный обходной путь, который я до сих пор придумал, - это использовать команду execute немедленно:

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

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

Другие советы

Нет другого способа, кроме как вызвать создать таблицу в execute (" создать таблицу ... ")

Руководство SYBASE гласит:

  

Когда команда создания таблицы встречается в блоке if ... else или   в то время как цикл Adaptive Server создает схему для таблицы до   определить, является ли условие истинным. Это может привести к ошибкам, если   таблица уже существует Чтобы избежать этой ситуации, либо убедитесь, что   просмотр с таким же именем еще не существует в базе данных или не используется   оператор execute, как показано ниже:

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

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

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

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

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

CREATE TABLE tableNameWithUserPart ...

Обходных путей не требуется;)

Согласно документации:

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 object_id('a_table') IS NULL
BEGIN
    CREATE TABLE a_table (
        col1 int not null,
        col2 int null
    ) 
END

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

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

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

ЕСЛИ НЕ СУЩЕСТВУЕТ (     ВЫБРАТЬ Счетчик (1)     ОТ системного объекта     ГДЕ имя = 'a_table'     И тип = 'U' ) <Сильный> НАЧАТЬ CREATE TABLE a_table (     col1 int не нуль,     col2 int null ) <Сильный> END GO

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top