Как условно создать таблицу в Sybase (SQL)?
-
08-07-2019 - |
Вопрос
Хорошо, поэтому 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