Как условно создать таблицу в 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