Как условно создать таблицу в Sybase (TSQL)?

ОК, поэтому 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 в строке: 7 Сообщение: есть уже объект с именем 'a_table' в базы данных.

Что с этим связано?!

Ответ 1

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

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

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

Ответ 2

Нет другого способа, кроме вызова create table в execute("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

Ответ 3

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

Ответ 4

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

Ответ 5

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

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

CREATE TABLE tableNameWithUserPart ...

Ответ 6

Нет обходных решений;)

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

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.

Ответ 7

Это работает при тестировании с Sybase где угодно 10.01:

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

Ответ 8

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

Ответ 9

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

ЕСЛИ НЕ СУЩЕСТВУЕТ (   SELECT Count (1)   FROM sysobjects   WHERE name = 'a_table'   AND type = 'U' ) НАЧАТЬ CREATE TABLE a_table (   col1 int не равно нулю,   col2 int null ) END GO