Pergunta

OK, então Sybase (12.5.4) vai me deixar fazer o seguinte para remover uma tabela se ela já existe:

IF EXISTS (
    SELECT 1
    FROM sysobjects
    WHERE name = 'a_table'
    AND type = 'U'
)
DROP TABLE a_table
GO

Mas se eu tentar fazer o mesmo com a criação da tabela, eu sempre chegar advertiu que a tabela já existe, porque ele foi em frente e tentou criar minha mesa e ignorou a declaração condicional. Apenas tente executar a seguinte declaração duas vezes, você verá o que quero dizer:

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

A execução do acima produz o seguinte erro:

Error SQL Server em (localhost) Erro: 2714 na Linha: 7 Mensagem: Há já um objeto chamado 'a_Table' em o banco de dados.

Qual é o problema com isso?!

Foi útil?

Solução

A única solução que eu vim acima com até agora é usar executar imediata:

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

funciona como um encanto, se sente como um truque sujo.

Outras dicas

Não há outra maneira de chamar create table em execute("create table ...")

Manual SYBASE diz:

Quando um criar a tabela de comando ocorre dentro de um bloco ou de um else if ... enquanto loop, Adaptive Server cria o esquema para a tabela antes determinar se a condição for verdadeira. Isso pode levar a erros se a tabela já existe. Para evitar essa situação, quer certificar-se de um vista com o mesmo nome ainda não existir no banco de dados ou utilização uma instrução de execução, da seguinte forma:

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

Eu não testei isso, mas você pode tentar mover a instrução CREATE TABLE em uma sproc. Você poderia, então, condicionalmente chamar que sproc com base no seu existente se comunicado.

Atribuir a declaração "CREATE TABLE" em um @variable caractere e, em seguida, fazer um EXEC (@variable).

Se você quiser criar sempre a mesa, mas condicionalmente soltá-lo, você pode usar:

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

CREATE TABLE tableNameWithUserPart ...

Não há soluções alternativas necessárias;)

De acordo com a documentação:

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 ]

Basta usar o SE NÃO EXISTE.

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

Isso funciona quando testado com Sybase em qualquer lugar 10.01 :

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

Tente usar Begin e End.

SE NÃO EXISTE ( SELECT Count (1) DE sysobjects Onde name = 'a_Table' E type = 'U' ) BEGIN CRIAR a_Table TABLE ( col1 não int nulo, col2 int nulo ) END GO

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top