Как условно создать таблицу в Sybase (TSQL)? - PullRequest
12 голосов
/ 21 ноября 2008

ОК, поэтому 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" в база данных.

В чем дело?!

Ответы [ 9 ]

13 голосов
/ 21 ноября 2008

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

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

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

7 голосов
/ 22 декабря 2009

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

В руководстве SYBASE написано:

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

if not exists
    (select * from sysobjects where name="my table")
begin
execute "create table mytable(x int)"
end
2 голосов
/ 21 ноября 2008

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

1 голос
/ 21 февраля 2011

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

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

CREATE TABLE tableNameWithUserPart ...
1 голос
/ 12 июня 2009

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

0 голосов
/ 16 января 2015

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

if not exists(select * from SysColumns where tname = 'AAA') then create table DBA.AAA(  UNIQUEID integer not null ) END IF ;
0 голосов
/ 02 ноября 2012

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

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

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 ]

Просто используйте ЕСЛИ НЕ СУЩЕСТВУЕТ.

0 голосов
/ 01 декабря 2008

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

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

0 голосов
/ 21 ноября 2008
IF object_id('a_table') IS NULL
BEGIN
    CREATE TABLE a_table (
        col1 int not null,
        col2 int null
    ) 
END
...